From f6a7c194b2e1d7f6ae15f683a0e55a9e9b5eb323 Mon Sep 17 00:00:00 2001 From: bjorn3 <17426603+bjorn3@users.noreply.github.com> Date: Fri, 13 Mar 2026 22:22:11 +0100 Subject: [PATCH 1/3] drivers/graphics: Refcount all DRM objects This is necessary to be able to properly handle objects that reference each other and in doing so keep each other alive. --- .../graphics/driver-graphics/src/connector.rs | 24 +++++++++---------- drivers/graphics/driver-graphics/src/lib.rs | 12 +++++++--- .../graphics/driver-graphics/src/objects.rs | 20 +++++----------- .../driver-graphics/src/properties.rs | 10 +++++--- drivers/graphics/ihdgd/src/device/scheme.rs | 2 +- drivers/graphics/vesad/src/scheme.rs | 3 ++- drivers/graphics/virtio-gpud/src/scheme.rs | 4 +++- 7 files changed, 39 insertions(+), 36 deletions(-) diff --git a/drivers/graphics/driver-graphics/src/connector.rs b/drivers/graphics/driver-graphics/src/connector.rs index 7cf4ddd275..7a71e603db 100644 --- a/drivers/graphics/driver-graphics/src/connector.rs +++ b/drivers/graphics/driver-graphics/src/connector.rs @@ -1,5 +1,6 @@ use std::ffi::c_char; use std::fmt::Debug; +use std::sync::Mutex; use drm_sys::{ drm_mode_modeinfo, DRM_MODE_CONNECTOR_Unknown, DRM_MODE_OBJECT_CONNECTOR, @@ -19,7 +20,7 @@ impl DrmObjects { }); self.encoders.push(encoder_id); - let connector_id = self.add(DrmConnector { + let connector_id = self.add(Mutex::new(DrmConnector { encoder_id, modes: vec![], connector_type: DRM_MODE_CONNECTOR_Unknown, @@ -29,7 +30,7 @@ impl DrmObjects { mm_height: 0, subpixel: DrmSubpixelOrder::Unknown, driver_data, - }); + })); self.connectors.push(connector_id); connector_id @@ -39,21 +40,18 @@ impl DrmObjects { &self.connectors } - pub fn connectors(&self) -> impl Iterator> + use<'_, T> { - self.connectors.iter().map(|&id| self.get(id).unwrap()) + pub fn connectors( + &self, + ) -> impl Iterator>> + use<'_, T> { + self.connectors + .iter() + .map(|&id| self.get_connector(id).unwrap()) } - pub fn get_connector(&self, id: DrmObjectId) -> Result<&DrmConnector> { + pub fn get_connector(&self, id: DrmObjectId) -> Result<&Mutex>> { self.get(id) } - pub fn get_connector_mut( - &mut self, - id: DrmObjectId, - ) -> Result<&mut DrmConnector> { - self.get_mut(id) - } - pub fn encoder_ids(&self) -> &[DrmObjectId] { &self.encoders } @@ -177,7 +175,7 @@ pub enum DrmSubpixelOrder { None, } -impl DrmObject for DrmConnector { +impl DrmObject for Mutex> { fn object_type(&self) -> u32 { DRM_MODE_OBJECT_CONNECTOR } diff --git a/drivers/graphics/driver-graphics/src/lib.rs b/drivers/graphics/driver-graphics/src/lib.rs index b3425d56d9..4ab6eb00d4 100644 --- a/drivers/graphics/driver-graphics/src/lib.rs +++ b/drivers/graphics/driver-graphics/src/lib.rs @@ -609,12 +609,16 @@ impl SchemeSync for GraphicsSchemeInner { } let connector = self .objects - .get_connector(DrmObjectId(data.connector_id()))?; + .get_connector(DrmObjectId(data.connector_id()))? + .lock() + .unwrap(); data.set_encoders_ptr(&[connector.encoder_id.0]); data.set_modes_ptr(&connector.modes); let props = self .objects - .get_object_properties(DrmObjectId(data.connector_id()))?; + .get_object_properties(DrmObjectId(data.connector_id()))? + .lock() + .unwrap(); data.set_props_ptr(&props.iter().map(|&(id, _)| id.0).collect::>()); data.set_prop_values_ptr( &props.iter().map(|&(_, value)| value).collect::>(), @@ -800,7 +804,9 @@ impl SchemeSync for GraphicsSchemeInner { let props = self .objects - .get_object_properties(DrmObjectId(data.obj_id()))?; + .get_object_properties(DrmObjectId(data.obj_id()))? + .lock() + .unwrap(); data.set_props_ptr(&props.iter().map(|&(id, _)| id.0).collect::>()); data.set_prop_values_ptr( &props.iter().map(|&(_, value)| value).collect::>(), diff --git a/drivers/graphics/driver-graphics/src/objects.rs b/drivers/graphics/driver-graphics/src/objects.rs index 0821781cd5..942d6cf84c 100644 --- a/drivers/graphics/driver-graphics/src/objects.rs +++ b/drivers/graphics/driver-graphics/src/objects.rs @@ -2,6 +2,7 @@ use std::any::Any; use std::collections::HashMap; use std::fmt::Debug; use std::marker::PhantomData; +use std::sync::{Arc, Mutex}; use syscall::{Error, Result, EINVAL}; @@ -12,7 +13,7 @@ pub struct DrmObjects { next_id: DrmObjectId, pub(crate) connectors: Vec, pub(crate) encoders: Vec, - pub(crate) objects: HashMap, + pub(crate) objects: HashMap>, _marker: PhantomData, } @@ -31,10 +32,10 @@ impl DrmObjects { let id = self.next_id; self.objects.insert( id, - DrmObjectData { + Arc::new(DrmObjectData { kind: Box::new(data), - properties: vec![], - }, + properties: Mutex::new(vec![]), + }), ); self.next_id.0 += 1; @@ -50,15 +51,6 @@ impl DrmObjects { } } - pub(crate) fn get_mut(&mut self, id: DrmObjectId) -> Result<&mut U> { - let object = self.objects.get_mut(&id).ok_or(Error::new(EINVAL))?; - if let Some(object) = (&mut *object.kind as &mut dyn Any).downcast_mut::() { - Ok(object) - } else { - Err(Error::new(EINVAL)) - } - } - pub fn object_type(&self, id: DrmObjectId) -> Result { let object = self.objects.get(&id).ok_or(Error::new(EINVAL))?; Ok(object.kind.object_type()) @@ -81,7 +73,7 @@ impl From for u64 { #[derive(Debug)] pub(crate) struct DrmObjectData { kind: Box, - pub(crate) properties: Vec<(DrmObjectId, u64)>, + pub(crate) properties: Mutex>, } pub trait DrmObject: Any + Debug { diff --git a/drivers/graphics/driver-graphics/src/properties.rs b/drivers/graphics/driver-graphics/src/properties.rs index 4ce9169135..797f0b838b 100644 --- a/drivers/graphics/driver-graphics/src/properties.rs +++ b/drivers/graphics/driver-graphics/src/properties.rs @@ -1,5 +1,6 @@ use std::ffi::c_char; use std::fmt::Debug; +use std::sync::Mutex; use drm_sys::{DRM_MODE_OBJECT_BLOB, DRM_MODE_OBJECT_PROPERTY, DRM_PROP_NAME_LEN}; use syscall::{Error, Result, EINVAL}; @@ -62,20 +63,23 @@ impl DrmObjects { pub fn add_object_property(&mut self, object: DrmObjectId, property: DrmObjectId, value: u64) { let object = self.objects.get_mut(&object).unwrap(); // FIXME validate property uniqueness and value - object.properties.push((property, value)); + object.properties.lock().unwrap().push((property, value)); } pub fn set_object_property(&mut self, object: DrmObjectId, property: DrmObjectId, value: u64) { let object = self.objects.get_mut(&object).unwrap(); // FIXME validate property existence and value - for (prop, val) in object.properties.iter_mut() { + for (prop, val) in object.properties.lock().unwrap().iter_mut() { if *prop == property { *val = value; } } } - pub fn get_object_properties(&self, id: DrmObjectId) -> Result<&[(DrmObjectId, u64)]> { + pub fn get_object_properties( + &self, + id: DrmObjectId, + ) -> Result<&Mutex>> { let object = self.objects.get(&id).ok_or(Error::new(EINVAL))?; Ok(&object.properties) } diff --git a/drivers/graphics/ihdgd/src/device/scheme.rs b/drivers/graphics/ihdgd/src/device/scheme.rs index 44171c8189..354be0955f 100644 --- a/drivers/graphics/ihdgd/src/device/scheme.rs +++ b/drivers/graphics/ihdgd/src/device/scheme.rs @@ -65,7 +65,7 @@ impl GraphicsAdapter for Device { _standard_properties: &StandardProperties, id: DrmObjectId, ) { - let connector = objects.get_connector_mut(id).unwrap(); + let mut connector = objects.get_connector(id).unwrap().lock().unwrap(); let framebuffer = &self.framebuffers[connector.driver_data.framebuffer_id]; connector.connection = DrmConnectorStatus::Connected; connector.update_from_size(framebuffer.width as u32, framebuffer.height as u32); diff --git a/drivers/graphics/vesad/src/scheme.rs b/drivers/graphics/vesad/src/scheme.rs index 58124d361a..eb71a4e775 100644 --- a/drivers/graphics/vesad/src/scheme.rs +++ b/drivers/graphics/vesad/src/scheme.rs @@ -68,7 +68,8 @@ impl GraphicsAdapter for FbAdapter { _standard_properties: &StandardProperties, id: DrmObjectId, ) { - let connector = objects.get_connector_mut(id).unwrap(); + let mut connector = objects.get_connector(id).unwrap().lock().unwrap(); + let connector = &mut *connector; connector.connection = DrmConnectorStatus::Connected; connector.update_from_size(connector.driver_data.width, connector.driver_data.height); } diff --git a/drivers/graphics/virtio-gpud/src/scheme.rs b/drivers/graphics/virtio-gpud/src/scheme.rs index 0acfddb4d5..ffad7a0858 100644 --- a/drivers/graphics/virtio-gpud/src/scheme.rs +++ b/drivers/graphics/virtio-gpud/src/scheme.rs @@ -308,7 +308,7 @@ impl<'a> GraphicsAdapter for VirtGpuAdapter<'a> { id: DrmObjectId, ) { futures::executor::block_on(async { - let connector = objects.get_connector_mut(id).unwrap(); + let mut connector = objects.get_connector(id).unwrap().lock().unwrap(); let display = &self.displays[connector.driver_data.display_id as usize]; connector.connection = if display.enabled { @@ -320,6 +320,8 @@ impl<'a> GraphicsAdapter for VirtGpuAdapter<'a> { if self.has_edid { connector.update_from_edid(&display.edid); + drop(connector); + let blob = objects.add_blob(display.edid.clone()); objects.set_object_property(id, standard_properties.edid, blob.into()); } else { From 977e13077d943248fdb3a3977d606cfeab506646 Mon Sep 17 00:00:00 2001 From: bjorn3 <17426603+bjorn3@users.noreply.github.com> Date: Fri, 13 Mar 2026 22:53:41 +0100 Subject: [PATCH 2/3] drivers/graphics: Require Debug to be implemented for Buffer --- drivers/graphics/driver-graphics/src/lib.rs | 2 +- drivers/graphics/ihdgd/src/device/scheme.rs | 1 + drivers/graphics/vesad/src/scheme.rs | 1 + drivers/graphics/virtio-gpud/src/scheme.rs | 11 +++++++++++ 4 files changed, 14 insertions(+), 1 deletion(-) diff --git a/drivers/graphics/driver-graphics/src/lib.rs b/drivers/graphics/driver-graphics/src/lib.rs index 4ab6eb00d4..88195124c7 100644 --- a/drivers/graphics/driver-graphics/src/lib.rs +++ b/drivers/graphics/driver-graphics/src/lib.rs @@ -77,7 +77,7 @@ pub trait GraphicsAdapter: Sized + Debug { fn handle_cursor(&mut self, cursor: Option<&CursorPlane>, dirty_fb: bool); } -pub trait Buffer { +pub trait Buffer: Debug { fn width(&self) -> u32; fn height(&self) -> u32; } diff --git a/drivers/graphics/ihdgd/src/device/scheme.rs b/drivers/graphics/ihdgd/src/device/scheme.rs index 354be0955f..dd32f6046b 100644 --- a/drivers/graphics/ihdgd/src/device/scheme.rs +++ b/drivers/graphics/ihdgd/src/device/scheme.rs @@ -146,6 +146,7 @@ impl DeviceFb { } } +#[derive(Debug)] pub struct DumbFb { width: usize, height: usize, diff --git a/drivers/graphics/vesad/src/scheme.rs b/drivers/graphics/vesad/src/scheme.rs index eb71a4e775..86eaeb786d 100644 --- a/drivers/graphics/vesad/src/scheme.rs +++ b/drivers/graphics/vesad/src/scheme.rs @@ -179,6 +179,7 @@ impl FrameBuffer { } } +#[derive(Debug)] pub struct GraphicScreen { width: usize, height: usize, diff --git a/drivers/graphics/virtio-gpud/src/scheme.rs b/drivers/graphics/virtio-gpud/src/scheme.rs index ffad7a0858..165545c8b0 100644 --- a/drivers/graphics/virtio-gpud/src/scheme.rs +++ b/drivers/graphics/virtio-gpud/src/scheme.rs @@ -42,6 +42,17 @@ pub struct VirtGpuFramebuffer<'a> { height: u32, } +impl<'a> fmt::Debug for VirtGpuFramebuffer<'a> { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_struct("VirtGpuFramebuffer") + .field("id", &self.id) + .field("sgl", &self.sgl) + .field("width", &self.width) + .field("height", &self.height) + .finish_non_exhaustive() + } +} + impl DrmBuffer for VirtGpuFramebuffer<'_> { fn width(&self) -> u32 { self.width From 20834544b7e43fcd1939c1044b40bb9c600edb03 Mon Sep 17 00:00:00 2001 From: bjorn3 <17426603+bjorn3@users.noreply.github.com> Date: Fri, 13 Mar 2026 23:39:45 +0100 Subject: [PATCH 3/3] drivers/graphics: Move KMS object handling to a submodule --- .../src/{ => kms}/connector.rs | 42 ++++++------- .../graphics/driver-graphics/src/kms/mod.rs | 3 + .../driver-graphics/src/{ => kms}/objects.rs | 42 ++++++------- .../src/{ => kms}/properties.rs | 52 ++++++++-------- drivers/graphics/driver-graphics/src/lib.rs | 60 +++++++++---------- drivers/graphics/ihdgd/src/device/scheme.rs | 12 ++-- drivers/graphics/vesad/src/scheme.rs | 12 ++-- drivers/graphics/virtio-gpud/src/main.rs | 2 +- drivers/graphics/virtio-gpud/src/scheme.rs | 14 ++--- 9 files changed, 120 insertions(+), 119 deletions(-) rename drivers/graphics/driver-graphics/src/{ => kms}/connector.rs (82%) create mode 100644 drivers/graphics/driver-graphics/src/kms/mod.rs rename drivers/graphics/driver-graphics/src/{ => kms}/objects.rs (56%) rename drivers/graphics/driver-graphics/src/{ => kms}/properties.rs (68%) diff --git a/drivers/graphics/driver-graphics/src/connector.rs b/drivers/graphics/driver-graphics/src/kms/connector.rs similarity index 82% rename from drivers/graphics/driver-graphics/src/connector.rs rename to drivers/graphics/driver-graphics/src/kms/connector.rs index 7a71e603db..bc63ac4d5d 100644 --- a/drivers/graphics/driver-graphics/src/connector.rs +++ b/drivers/graphics/driver-graphics/src/kms/connector.rs @@ -8,24 +8,24 @@ use drm_sys::{ }; use syscall::Result; -use crate::objects::{DrmObject, DrmObjectId, DrmObjects}; +use crate::kms::objects::{KmsObject, KmsObjectId, KmsObjects}; use crate::GraphicsAdapter; -impl DrmObjects { - pub fn add_connector(&mut self, driver_data: T::Connector) -> DrmObjectId { - let encoder_id = self.add(DrmEncoder { - crtc_id: DrmObjectId::INVALID, +impl KmsObjects { + pub fn add_connector(&mut self, driver_data: T::Connector) -> KmsObjectId { + let encoder_id = self.add(KmsEncoder { + crtc_id: KmsObjectId::INVALID, possible_crtcs: 0, possible_clones: 1 << self.encoders.len(), }); self.encoders.push(encoder_id); - let connector_id = self.add(Mutex::new(DrmConnector { + let connector_id = self.add(Mutex::new(KmsConnector { encoder_id, modes: vec![], connector_type: DRM_MODE_CONNECTOR_Unknown, connector_type_id: self.connectors.len() as u32, // FIXME maybe pick unique id within connector type? - connection: DrmConnectorStatus::Unknown, + connection: KmsConnectorStatus::Unknown, mm_width: 0, mm_height: 0, subpixel: DrmSubpixelOrder::Unknown, @@ -36,45 +36,45 @@ impl DrmObjects { connector_id } - pub fn connector_ids(&self) -> &[DrmObjectId] { + pub fn connector_ids(&self) -> &[KmsObjectId] { &self.connectors } pub fn connectors( &self, - ) -> impl Iterator>> + use<'_, T> { + ) -> impl Iterator>> + use<'_, T> { self.connectors .iter() .map(|&id| self.get_connector(id).unwrap()) } - pub fn get_connector(&self, id: DrmObjectId) -> Result<&Mutex>> { + pub fn get_connector(&self, id: KmsObjectId) -> Result<&Mutex>> { self.get(id) } - pub fn encoder_ids(&self) -> &[DrmObjectId] { + pub fn encoder_ids(&self) -> &[KmsObjectId] { &self.encoders } - pub fn get_encoder(&self, id: DrmObjectId) -> Result<&DrmEncoder> { + pub fn get_encoder(&self, id: KmsObjectId) -> Result<&KmsEncoder> { self.get(id) } } #[derive(Debug)] -pub struct DrmConnector { - pub encoder_id: DrmObjectId, +pub struct KmsConnector { + pub encoder_id: KmsObjectId, pub modes: Vec, pub connector_type: u32, pub connector_type_id: u32, - pub connection: DrmConnectorStatus, + pub connection: KmsConnectorStatus, pub mm_width: u32, pub mm_height: u32, pub subpixel: DrmSubpixelOrder, pub driver_data: T, } -impl DrmConnector { +impl KmsConnector { pub fn update_from_size(&mut self, width: u32, height: u32) { self.modes = vec![Self::modeinfo_for_size(width, height)]; } @@ -158,7 +158,7 @@ impl DrmConnector { #[derive(Debug, Copy, Clone)] #[repr(u32)] -pub enum DrmConnectorStatus { +pub enum KmsConnectorStatus { Disconnected = 0, Connected = 1, Unknown = 2, @@ -175,7 +175,7 @@ pub enum DrmSubpixelOrder { None, } -impl DrmObject for Mutex> { +impl KmsObject for Mutex> { fn object_type(&self) -> u32 { DRM_MODE_OBJECT_CONNECTOR } @@ -183,13 +183,13 @@ impl DrmObject for Mutex> { // FIXME can we represent connector and encoder using a single struct? #[derive(Debug)] -pub struct DrmEncoder { - pub crtc_id: DrmObjectId, +pub struct KmsEncoder { + pub crtc_id: KmsObjectId, pub possible_crtcs: u32, pub possible_clones: u32, } -impl DrmObject for DrmEncoder { +impl KmsObject for KmsEncoder { fn object_type(&self) -> u32 { DRM_MODE_OBJECT_ENCODER } diff --git a/drivers/graphics/driver-graphics/src/kms/mod.rs b/drivers/graphics/driver-graphics/src/kms/mod.rs new file mode 100644 index 0000000000..0181030ff2 --- /dev/null +++ b/drivers/graphics/driver-graphics/src/kms/mod.rs @@ -0,0 +1,3 @@ +pub mod connector; +pub mod objects; +pub mod properties; diff --git a/drivers/graphics/driver-graphics/src/objects.rs b/drivers/graphics/driver-graphics/src/kms/objects.rs similarity index 56% rename from drivers/graphics/driver-graphics/src/objects.rs rename to drivers/graphics/driver-graphics/src/kms/objects.rs index 942d6cf84c..2ee80276f4 100644 --- a/drivers/graphics/driver-graphics/src/objects.rs +++ b/drivers/graphics/driver-graphics/src/kms/objects.rs @@ -9,18 +9,18 @@ use syscall::{Error, Result, EINVAL}; use crate::GraphicsAdapter; #[derive(Debug)] -pub struct DrmObjects { - next_id: DrmObjectId, - pub(crate) connectors: Vec, - pub(crate) encoders: Vec, - pub(crate) objects: HashMap>, +pub struct KmsObjects { + next_id: KmsObjectId, + pub(crate) connectors: Vec, + pub(crate) encoders: Vec, + pub(crate) objects: HashMap>, _marker: PhantomData, } -impl DrmObjects { +impl KmsObjects { pub(crate) fn new() -> Self { - DrmObjects { - next_id: DrmObjectId(1), + KmsObjects { + next_id: KmsObjectId(1), connectors: vec![], encoders: vec![], objects: HashMap::new(), @@ -28,11 +28,11 @@ impl DrmObjects { } } - pub(crate) fn add(&mut self, data: U) -> DrmObjectId { + pub(crate) fn add(&mut self, data: U) -> KmsObjectId { let id = self.next_id; self.objects.insert( id, - Arc::new(DrmObjectData { + Arc::new(KmsObjectData { kind: Box::new(data), properties: Mutex::new(vec![]), }), @@ -42,7 +42,7 @@ impl DrmObjects { id } - pub(crate) fn get(&self, id: DrmObjectId) -> Result<&U> { + pub(crate) fn get(&self, id: KmsObjectId) -> Result<&U> { let object = self.objects.get(&id).ok_or(Error::new(EINVAL))?; if let Some(object) = (&*object.kind as &dyn Any).downcast_ref::() { Ok(object) @@ -51,31 +51,31 @@ impl DrmObjects { } } - pub fn object_type(&self, id: DrmObjectId) -> Result { + pub fn object_type(&self, id: KmsObjectId) -> Result { let object = self.objects.get(&id).ok_or(Error::new(EINVAL))?; Ok(object.kind.object_type()) } } #[derive(Debug, Copy, Clone, Eq, PartialEq, Hash)] -pub struct DrmObjectId(pub(crate) u32); +pub struct KmsObjectId(pub(crate) u32); -impl DrmObjectId { - pub const INVALID: DrmObjectId = DrmObjectId(0); +impl KmsObjectId { + pub const INVALID: KmsObjectId = KmsObjectId(0); } -impl From for u64 { - fn from(value: DrmObjectId) -> Self { +impl From for u64 { + fn from(value: KmsObjectId) -> Self { value.0.into() } } #[derive(Debug)] -pub(crate) struct DrmObjectData { - kind: Box, - pub(crate) properties: Mutex>, +pub(crate) struct KmsObjectData { + kind: Box, + pub(crate) properties: Mutex>, } -pub trait DrmObject: Any + Debug { +pub trait KmsObject: Any + Debug { fn object_type(&self) -> u32; } diff --git a/drivers/graphics/driver-graphics/src/properties.rs b/drivers/graphics/driver-graphics/src/kms/properties.rs similarity index 68% rename from drivers/graphics/driver-graphics/src/properties.rs rename to drivers/graphics/driver-graphics/src/kms/properties.rs index 797f0b838b..ac88b34bd2 100644 --- a/drivers/graphics/driver-graphics/src/properties.rs +++ b/drivers/graphics/driver-graphics/src/kms/properties.rs @@ -5,24 +5,24 @@ use std::sync::Mutex; use drm_sys::{DRM_MODE_OBJECT_BLOB, DRM_MODE_OBJECT_PROPERTY, DRM_PROP_NAME_LEN}; use syscall::{Error, Result, EINVAL}; -use crate::objects::{DrmObject, DrmObjectId, DrmObjects}; +use crate::kms::objects::{KmsObject, KmsObjectId, KmsObjects}; use crate::GraphicsAdapter; -impl DrmObjects { +impl KmsObjects { pub fn add_property( &mut self, name: &str, immutable: bool, atomic: bool, - kind: DrmPropertyKind, - ) -> DrmObjectId { + kind: KmsPropertyKind, + ) -> KmsObjectId { if name.len() > DRM_PROP_NAME_LEN as usize { panic!("Property name {name} is too long"); } match &kind { - DrmPropertyKind::Range(start, end) => assert!(start < end), - DrmPropertyKind::Enum(variants) => { + KmsPropertyKind::Range(start, end) => assert!(start < end), + KmsPropertyKind::Enum(variants) => { // FIXME check duplicate variant numbers for (variant_name, _) in variants { if variant_name.len() > DRM_PROP_NAME_LEN as usize { @@ -30,8 +30,8 @@ impl DrmObjects { } } } - DrmPropertyKind::Blob => {} - DrmPropertyKind::Bitmask(bitmask_flags) => { + KmsPropertyKind::Blob => {} + KmsPropertyKind::Bitmask(bitmask_flags) => { // FIXME check overlapping flag numbers for (flag_name, _) in bitmask_flags { if flag_name.len() > DRM_PROP_NAME_LEN as usize { @@ -39,8 +39,8 @@ impl DrmObjects { } } } - DrmPropertyKind::Object => {} - DrmPropertyKind::SignedRange(start, end) => assert!(start < end), + KmsPropertyKind::Object => {} + KmsPropertyKind::SignedRange(start, end) => assert!(start < end), } let mut name_bytes = [0; DRM_PROP_NAME_LEN as usize]; @@ -48,7 +48,7 @@ impl DrmObjects { *to = from as c_char; } - self.add(DrmProperty { + self.add(KmsProperty { name: name_bytes, immutable, atomic, @@ -56,17 +56,17 @@ impl DrmObjects { }) } - pub fn get_property(&self, id: DrmObjectId) -> Result<&DrmProperty> { + pub fn get_property(&self, id: KmsObjectId) -> Result<&KmsProperty> { self.get(id) } - pub fn add_object_property(&mut self, object: DrmObjectId, property: DrmObjectId, value: u64) { + pub fn add_object_property(&mut self, object: KmsObjectId, property: KmsObjectId, value: u64) { let object = self.objects.get_mut(&object).unwrap(); // FIXME validate property uniqueness and value object.properties.lock().unwrap().push((property, value)); } - pub fn set_object_property(&mut self, object: DrmObjectId, property: DrmObjectId, value: u64) { + pub fn set_object_property(&mut self, object: KmsObjectId, property: KmsObjectId, value: u64) { let object = self.objects.get_mut(&object).unwrap(); // FIXME validate property existence and value for (prop, val) in object.properties.lock().unwrap().iter_mut() { @@ -78,31 +78,31 @@ impl DrmObjects { pub fn get_object_properties( &self, - id: DrmObjectId, - ) -> Result<&Mutex>> { + id: KmsObjectId, + ) -> Result<&Mutex>> { let object = self.objects.get(&id).ok_or(Error::new(EINVAL))?; Ok(&object.properties) } - pub fn add_blob(&mut self, data: Vec) -> DrmObjectId { - self.add(DrmBlob { data }) + pub fn add_blob(&mut self, data: Vec) -> KmsObjectId { + self.add(KmsBlob { data }) } - pub fn get_blob(&self, id: DrmObjectId) -> Result<&[u8]> { - Ok(&self.get::(id)?.data) + pub fn get_blob(&self, id: KmsObjectId) -> Result<&[u8]> { + Ok(&self.get::(id)?.data) } } #[derive(Debug)] -pub struct DrmProperty { +pub struct KmsProperty { pub name: [c_char; DRM_PROP_NAME_LEN as usize], pub immutable: bool, pub atomic: bool, - pub kind: DrmPropertyKind, + pub kind: KmsPropertyKind, } #[derive(Debug)] -pub enum DrmPropertyKind { +pub enum KmsPropertyKind { Range(u64, u64), Enum(Vec<(&'static str, u64)>), Blob, @@ -111,18 +111,18 @@ pub enum DrmPropertyKind { SignedRange(i64, i64), } -impl DrmObject for DrmProperty { +impl KmsObject for KmsProperty { fn object_type(&self) -> u32 { DRM_MODE_OBJECT_PROPERTY } } #[derive(Debug)] -pub struct DrmBlob { +pub struct KmsBlob { data: Vec, } -impl DrmObject for DrmBlob { +impl KmsObject for KmsBlob { fn object_type(&self) -> u32 { DRM_MODE_OBJECT_BLOB } diff --git a/drivers/graphics/driver-graphics/src/lib.rs b/drivers/graphics/driver-graphics/src/lib.rs index 88195124c7..3266368b0f 100644 --- a/drivers/graphics/driver-graphics/src/lib.rs +++ b/drivers/graphics/driver-graphics/src/lib.rs @@ -24,17 +24,15 @@ use redox_scheme::{CallerCtx, OpenResult, RequestKind, SignalBehavior, Socket}; use syscall::schemev2::NewFdFlags; use syscall::{Error, MapFlags, Result, EACCES, EAGAIN, EBADF, EINVAL, ENOENT, EOPNOTSUPP}; -use crate::objects::{DrmObjectId, DrmObjects}; -use crate::properties::DrmPropertyKind; +use crate::kms::objects::{KmsObjectId, KmsObjects}; +use crate::kms::properties::KmsPropertyKind; -pub mod connector; -pub mod objects; -pub mod properties; +pub mod kms; #[derive(Debug, Copy, Clone)] pub struct StandardProperties { - pub edid: DrmObjectId, - pub dpms: DrmObjectId, + pub edid: KmsObjectId, + pub dpms: KmsObjectId, } pub trait GraphicsAdapter: Sized + Debug { @@ -45,16 +43,16 @@ pub trait GraphicsAdapter: Sized + Debug { fn name(&self) -> &'static [u8]; fn desc(&self) -> &'static [u8]; - fn init(&mut self, objects: &mut DrmObjects, standard_properties: &StandardProperties); + fn init(&mut self, objects: &mut KmsObjects, standard_properties: &StandardProperties); fn get_cap(&self, cap: u32) -> Result; fn set_client_cap(&self, cap: u32, value: u64) -> Result<()>; fn probe_connector( &mut self, - objects: &mut DrmObjects, + objects: &mut KmsObjects, standard_properties: &StandardProperties, - id: DrmObjectId, + id: KmsObjectId, ); /// The maximum amount of displays that could be attached. @@ -107,14 +105,14 @@ impl GraphicsScheme { .expect("vesad: Failed to open /scheme/debug/disable-graphical-debug"), ); - let mut objects = DrmObjects::new(); + let mut objects = KmsObjects::new(); - let edid = objects.add_property("EDID", true, false, DrmPropertyKind::Blob); + let edid = objects.add_property("EDID", true, false, KmsPropertyKind::Blob); let dpms = objects.add_property( "DPMS", false, false, - DrmPropertyKind::Enum(vec![ + KmsPropertyKind::Enum(vec![ ("On", DRM_MODE_DPMS_ON.into()), ("Standby", DRM_MODE_DPMS_STANDBY.into()), ("Suspend", DRM_MODE_DPMS_SUSPEND.into()), @@ -174,15 +172,15 @@ impl GraphicsScheme { &mut self.inner.adapter } - pub fn objects(&self) -> &DrmObjects { + pub fn kms_objects(&self) -> &KmsObjects { &self.inner.objects } - pub fn objects_mut(&mut self) -> &mut DrmObjects { + pub fn kms_objects_mut(&mut self) -> &mut KmsObjects { &mut self.inner.objects } - pub fn adapter_and_objects_mut(&mut self) -> (&mut T, &mut DrmObjects) { + pub fn adapter_and_kms_objects_mut(&mut self) -> (&mut T, &mut KmsObjects) { (&mut self.inner.adapter, &mut self.inner.objects) } @@ -290,7 +288,7 @@ struct GraphicsSchemeInner { scheme_name: String, disable_graphical_debug: Option, socket: Socket, - objects: DrmObjects, + objects: KmsObjects, standard_properties: StandardProperties, next_id: usize, handles: BTreeMap>, @@ -593,7 +591,7 @@ impl SchemeSync for GraphicsSchemeInner { Ok(0) }), ipc::MODE_GET_ENCODER => ipc::DrmModeGetEncoder::with(payload, |mut data| { - let encoder = self.objects.get_encoder(DrmObjectId(data.encoder_id()))?; + let encoder = self.objects.get_encoder(KmsObjectId(data.encoder_id()))?; data.set_crtc_id(encoder.crtc_id.0); data.set_possible_crtcs(encoder.possible_crtcs); data.set_possible_clones(encoder.possible_clones); @@ -604,19 +602,19 @@ impl SchemeSync for GraphicsSchemeInner { self.adapter.probe_connector( &mut self.objects, &self.standard_properties, - DrmObjectId(data.connector_id()), + KmsObjectId(data.connector_id()), ); } let connector = self .objects - .get_connector(DrmObjectId(data.connector_id()))? + .get_connector(KmsObjectId(data.connector_id()))? .lock() .unwrap(); data.set_encoders_ptr(&[connector.encoder_id.0]); data.set_modes_ptr(&connector.modes); let props = self .objects - .get_object_properties(DrmObjectId(data.connector_id()))? + .get_object_properties(KmsObjectId(data.connector_id()))? .lock() .unwrap(); data.set_props_ptr(&props.iter().map(|&(id, _)| id.0).collect::>()); @@ -632,7 +630,7 @@ impl SchemeSync for GraphicsSchemeInner { Ok(0) }), ipc::MODE_GET_PROPERTY => ipc::DrmModeGetProperty::with(payload, |mut data| { - let property = self.objects.get_property(DrmObjectId(data.prop_id()))?; + let property = self.objects.get_property(KmsObjectId(data.prop_id()))?; data.set_name(property.name); let mut flags = 0; if property.immutable { @@ -642,12 +640,12 @@ impl SchemeSync for GraphicsSchemeInner { flags |= DRM_MODE_PROP_ATOMIC; } match &property.kind { - &DrmPropertyKind::Range(start, end) => { + &KmsPropertyKind::Range(start, end) => { data.set_flags(flags | DRM_MODE_PROP_RANGE); data.set_values_ptr(&[start, end]); data.set_enum_blob_ptr(&[]); } - DrmPropertyKind::Enum(variants) => { + KmsPropertyKind::Enum(variants) => { data.set_flags(flags | DRM_MODE_PROP_ENUM); data.set_values_ptr( &variants.iter().map(|&(_, value)| value).collect::>(), @@ -670,12 +668,12 @@ impl SchemeSync for GraphicsSchemeInner { .collect::>(), ); } - DrmPropertyKind::Blob => { + KmsPropertyKind::Blob => { data.set_flags(flags | DRM_MODE_PROP_BLOB); data.set_values_ptr(&[]); data.set_enum_blob_ptr(&[]); } - DrmPropertyKind::Bitmask(bitmask_flags) => { + KmsPropertyKind::Bitmask(bitmask_flags) => { data.set_flags(flags | DRM_MODE_PROP_BITMASK); data.set_values_ptr( &bitmask_flags @@ -701,12 +699,12 @@ impl SchemeSync for GraphicsSchemeInner { .collect::>(), ); } - DrmPropertyKind::Object => { + KmsPropertyKind::Object => { data.set_flags(flags | DRM_MODE_PROP_OBJECT); data.set_values_ptr(&[]); data.set_enum_blob_ptr(&[]); } - &DrmPropertyKind::SignedRange(start, end) => { + &KmsPropertyKind::SignedRange(start, end) => { data.set_flags(flags | DRM_MODE_PROP_SIGNED_RANGE); data.set_values_ptr(&[start as u64, end as u64]); data.set_enum_blob_ptr(&[]); @@ -715,7 +713,7 @@ impl SchemeSync for GraphicsSchemeInner { Ok(0) }), ipc::MODE_GET_PROP_BLOB => ipc::DrmModeGetBlob::with(payload, |mut data| { - let blob = self.objects.get_blob(DrmObjectId(data.blob_id()))?; + let blob = self.objects.get_blob(KmsObjectId(data.blob_id()))?; data.set_data(&blob); Ok(0) }), @@ -804,14 +802,14 @@ impl SchemeSync for GraphicsSchemeInner { let props = self .objects - .get_object_properties(DrmObjectId(data.obj_id()))? + .get_object_properties(KmsObjectId(data.obj_id()))? .lock() .unwrap(); data.set_props_ptr(&props.iter().map(|&(id, _)| id.0).collect::>()); data.set_prop_values_ptr( &props.iter().map(|&(_, value)| value).collect::>(), ); - data.set_obj_type(self.objects.object_type(DrmObjectId(data.obj_id()))?); + data.set_obj_type(self.objects.object_type(KmsObjectId(data.obj_id()))?); Ok(0) }) } diff --git a/drivers/graphics/ihdgd/src/device/scheme.rs b/drivers/graphics/ihdgd/src/device/scheme.rs index dd32f6046b..8fd741bb89 100644 --- a/drivers/graphics/ihdgd/src/device/scheme.rs +++ b/drivers/graphics/ihdgd/src/device/scheme.rs @@ -4,8 +4,8 @@ use std::alloc::{self, Layout}; use std::convert::TryInto; use std::ptr::{self, NonNull}; -use driver_graphics::connector::DrmConnectorStatus; -use driver_graphics::objects::{DrmObjectId, DrmObjects}; +use driver_graphics::kms::connector::KmsConnectorStatus; +use driver_graphics::kms::objects::{KmsObjectId, KmsObjects}; use driver_graphics::{Buffer, CursorPlane, GraphicsAdapter, StandardProperties}; use drm_sys::DRM_MODE_DPMS_ON; use graphics_ipc::v2::ipc::{DRM_CAP_DUMB_BUFFER, DRM_CLIENT_CAP_CURSOR_PLANE_HOTSPOT}; @@ -32,7 +32,7 @@ impl GraphicsAdapter for Device { b"Intel HD Graphics" } - fn init(&mut self, objects: &mut DrmObjects, standard_properties: &StandardProperties) { + fn init(&mut self, objects: &mut KmsObjects, standard_properties: &StandardProperties) { // FIXME enumerate actual connectors for (framebuffer_id, _) in self.framebuffers.iter().enumerate() { let connector = objects.add_connector(Connector { framebuffer_id }); @@ -61,13 +61,13 @@ impl GraphicsAdapter for Device { fn probe_connector( &mut self, - objects: &mut DrmObjects, + objects: &mut KmsObjects, _standard_properties: &StandardProperties, - id: DrmObjectId, + id: KmsObjectId, ) { let mut connector = objects.get_connector(id).unwrap().lock().unwrap(); let framebuffer = &self.framebuffers[connector.driver_data.framebuffer_id]; - connector.connection = DrmConnectorStatus::Connected; + connector.connection = KmsConnectorStatus::Connected; connector.update_from_size(framebuffer.width as u32, framebuffer.height as u32); // FIXME fetch EDID } diff --git a/drivers/graphics/vesad/src/scheme.rs b/drivers/graphics/vesad/src/scheme.rs index 86eaeb786d..f1bbd60cba 100644 --- a/drivers/graphics/vesad/src/scheme.rs +++ b/drivers/graphics/vesad/src/scheme.rs @@ -2,8 +2,8 @@ use std::alloc::{self, Layout}; use std::convert::TryInto; use std::ptr::{self, NonNull}; -use driver_graphics::connector::DrmConnectorStatus; -use driver_graphics::objects::{DrmObjectId, DrmObjects}; +use driver_graphics::kms::connector::KmsConnectorStatus; +use driver_graphics::kms::objects::{KmsObjectId, KmsObjects}; use driver_graphics::{Buffer, CursorPlane, GraphicsAdapter, StandardProperties}; use drm_sys::DRM_MODE_DPMS_ON; use graphics_ipc::v2::ipc::{DRM_CAP_DUMB_BUFFER, DRM_CLIENT_CAP_CURSOR_PLANE_HOTSPOT}; @@ -34,7 +34,7 @@ impl GraphicsAdapter for FbAdapter { b"VESA" } - fn init(&mut self, objects: &mut DrmObjects, standard_properties: &StandardProperties) { + fn init(&mut self, objects: &mut KmsObjects, standard_properties: &StandardProperties) { for framebuffer in &self.framebuffers { let connector = objects.add_connector(Connector { width: framebuffer.width as u32, @@ -64,13 +64,13 @@ impl GraphicsAdapter for FbAdapter { fn probe_connector( &mut self, - objects: &mut DrmObjects, + objects: &mut KmsObjects, _standard_properties: &StandardProperties, - id: DrmObjectId, + id: KmsObjectId, ) { let mut connector = objects.get_connector(id).unwrap().lock().unwrap(); let connector = &mut *connector; - connector.connection = DrmConnectorStatus::Connected; + connector.connection = KmsConnectorStatus::Connected; connector.update_from_size(connector.driver_data.width, connector.driver_data.height); } diff --git a/drivers/graphics/virtio-gpud/src/main.rs b/drivers/graphics/virtio-gpud/src/main.rs index 8bf1239ef0..58e6381189 100644 --- a/drivers/graphics/virtio-gpud/src/main.rs +++ b/drivers/graphics/virtio-gpud/src/main.rs @@ -587,7 +587,7 @@ fn deamon(deamon: daemon::Daemon, mut pcid_handle: PciFunctionHandle) -> anyhow: if events & VIRTIO_GPU_EVENT_DISPLAY != 0 { let standard_properties = scheme.standard_properties(); - let (adapter, objects) = scheme.adapter_and_objects_mut(); + let (adapter, objects) = scheme.adapter_and_kms_objects_mut(); futures::executor::block_on(async { adapter.update_displays().await.unwrap() }); for connector_id in objects.connector_ids().to_vec() { adapter.probe_connector(objects, &standard_properties, connector_id); diff --git a/drivers/graphics/virtio-gpud/src/scheme.rs b/drivers/graphics/virtio-gpud/src/scheme.rs index 165545c8b0..7cddf275ae 100644 --- a/drivers/graphics/virtio-gpud/src/scheme.rs +++ b/drivers/graphics/virtio-gpud/src/scheme.rs @@ -2,8 +2,8 @@ use std::fmt; use std::sync::Arc; use common::{dma::Dma, sgl}; -use driver_graphics::connector::DrmConnectorStatus; -use driver_graphics::objects::{DrmObjectId, DrmObjects}; +use driver_graphics::kms::connector::KmsConnectorStatus; +use driver_graphics::kms::objects::{KmsObjectId, KmsObjects}; use driver_graphics::{ Buffer as DrmBuffer, CursorPlane, GraphicsAdapter, GraphicsScheme, StandardProperties, }; @@ -277,7 +277,7 @@ impl<'a> GraphicsAdapter for VirtGpuAdapter<'a> { b"VirtIO GPU" } - fn init(&mut self, objects: &mut DrmObjects, standard_properties: &StandardProperties) { + fn init(&mut self, objects: &mut KmsObjects, standard_properties: &StandardProperties) { futures::executor::block_on(async { self.update_displays().await.unwrap(); }); @@ -314,18 +314,18 @@ impl<'a> GraphicsAdapter for VirtGpuAdapter<'a> { fn probe_connector( &mut self, - objects: &mut DrmObjects, + objects: &mut KmsObjects, standard_properties: &StandardProperties, - id: DrmObjectId, + id: KmsObjectId, ) { futures::executor::block_on(async { let mut connector = objects.get_connector(id).unwrap().lock().unwrap(); let display = &self.displays[connector.driver_data.display_id as usize]; connector.connection = if display.enabled { - DrmConnectorStatus::Connected + KmsConnectorStatus::Connected } else { - DrmConnectorStatus::Disconnected + KmsConnectorStatus::Disconnected }; if self.has_edid {