From c088e48948ef1fdfe27547f2e0f6ae4db19f7882 Mon Sep 17 00:00:00 2001 From: bjorn3 <17426603+bjorn3@users.noreply.github.com> Date: Fri, 13 Mar 2026 21:57:44 +0100 Subject: [PATCH] drivers/graphics: Move DrmConnector and DrmEncoder to a separate module --- .../graphics/driver-graphics/src/connector.rs | 115 ++++++++++++++++++ drivers/graphics/driver-graphics/src/lib.rs | 1 + .../graphics/driver-graphics/src/objects.rs | 115 +----------------- drivers/graphics/ihdgd/src/device/scheme.rs | 3 +- drivers/graphics/vesad/src/scheme.rs | 3 +- drivers/graphics/virtio-gpud/src/scheme.rs | 3 +- 6 files changed, 124 insertions(+), 116 deletions(-) create mode 100644 drivers/graphics/driver-graphics/src/connector.rs diff --git a/drivers/graphics/driver-graphics/src/connector.rs b/drivers/graphics/driver-graphics/src/connector.rs new file mode 100644 index 0000000000..26254a6039 --- /dev/null +++ b/drivers/graphics/driver-graphics/src/connector.rs @@ -0,0 +1,115 @@ +use std::fmt::Debug; + +use drm_sys::{ + drm_mode_modeinfo, DRM_MODE_CONNECTOR_Unknown, DRM_MODE_OBJECT_CONNECTOR, + DRM_MODE_OBJECT_ENCODER, +}; +use syscall::Result; + +use crate::objects::{DrmObject, DrmObjectId, DrmObjects}; +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, + possible_crtcs: 0, + possible_clones: 1 << self.encoders.len(), + }); + self.encoders.push(encoder_id); + + let connector_id = self.add(DrmConnector { + 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, + mm_width: 0, + mm_height: 0, + subpixel: DrmSubpixelOrder::Unknown, + driver_data, + }); + self.connectors.push(connector_id); + + connector_id + } + + pub fn connector_ids(&self) -> &[DrmObjectId] { + &self.connectors + } + + pub fn connectors(&self) -> impl Iterator> + use<'_, T> { + self.connectors.iter().map(|&id| self.get(id).unwrap()) + } + + pub fn get_connector(&self, id: DrmObjectId) -> Result<&DrmConnector> { + 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 + } + + pub fn get_encoder(&self, id: DrmObjectId) -> Result<&DrmEncoder> { + self.get(id) + } +} + +#[derive(Debug)] +pub struct DrmConnector { + pub encoder_id: DrmObjectId, + pub modes: Vec, + pub connector_type: u32, + pub connector_type_id: u32, + pub connection: DrmConnectorStatus, + pub mm_width: u32, + pub mm_height: u32, + pub subpixel: DrmSubpixelOrder, + pub driver_data: T, +} + +#[derive(Debug, Copy, Clone)] +#[repr(u32)] +pub enum DrmConnectorStatus { + Disconnected = 0, + Connected = 1, + Unknown = 2, +} + +#[derive(Debug, Copy, Clone)] +#[repr(u32)] +pub enum DrmSubpixelOrder { + Unknown = 0, + HorizontalRGB, + HorizontalBGR, + VerticalRGB, + VerticalBGR, + None, +} + +impl DrmObject for DrmConnector { + fn object_type(&self) -> u32 { + DRM_MODE_OBJECT_CONNECTOR + } +} + +// FIXME can we represent connector and encoder using a single struct? +#[derive(Debug)] +pub struct DrmEncoder { + pub crtc_id: DrmObjectId, + pub possible_crtcs: u32, + pub possible_clones: u32, +} + +impl DrmObject for DrmEncoder { + fn object_type(&self) -> u32 { + DRM_MODE_OBJECT_ENCODER + } +} diff --git a/drivers/graphics/driver-graphics/src/lib.rs b/drivers/graphics/driver-graphics/src/lib.rs index 0c4710f125..c5186467cc 100644 --- a/drivers/graphics/driver-graphics/src/lib.rs +++ b/drivers/graphics/driver-graphics/src/lib.rs @@ -27,6 +27,7 @@ use syscall::{Error, MapFlags, Result, EACCES, EAGAIN, EBADF, EINVAL, ENOENT, EO use crate::objects::{DrmObjectId, DrmObjects}; use crate::properties::DrmPropertyKind; +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/objects.rs index 03d825f430..0821781cd5 100644 --- a/drivers/graphics/driver-graphics/src/objects.rs +++ b/drivers/graphics/driver-graphics/src/objects.rs @@ -3,10 +3,6 @@ use std::collections::HashMap; use std::fmt::Debug; use std::marker::PhantomData; -use drm_sys::{ - drm_mode_modeinfo, DRM_MODE_CONNECTOR_Unknown, DRM_MODE_OBJECT_CONNECTOR, - DRM_MODE_OBJECT_ENCODER, -}; use syscall::{Error, Result, EINVAL}; use crate::GraphicsAdapter; @@ -14,8 +10,8 @@ use crate::GraphicsAdapter; #[derive(Debug)] pub struct DrmObjects { next_id: DrmObjectId, - connectors: Vec, - encoders: Vec, + pub(crate) connectors: Vec, + pub(crate) encoders: Vec, pub(crate) objects: HashMap, _marker: PhantomData, } @@ -67,61 +63,6 @@ impl DrmObjects { let object = self.objects.get(&id).ok_or(Error::new(EINVAL))?; Ok(object.kind.object_type()) } - - pub fn add_connector(&mut self, driver_data: T::Connector) -> DrmObjectId { - let encoder_id = self.add(DrmEncoder { - crtc_id: DrmObjectId::INVALID, - possible_crtcs: 0, - possible_clones: 1 << self.encoders.len(), - }); - self.encoders.push(encoder_id); - - let connector_id = self.add(DrmConnector { - 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, - mm_width: 0, - mm_height: 0, - subpixel: DrmSubpixelOrder::Unknown, - driver_data, - }); - self.connectors.push(connector_id); - - connector_id - } - - pub fn connector_ids(&self) -> &[DrmObjectId] { - &self.connectors - } - - pub fn connectors(&self) -> impl Iterator> + use<'_, T> { - self.connectors.iter().map(|&id| { - (&self.objects[&id].kind as &dyn Any) - .downcast_ref::>() - .unwrap() - }) - } - - pub fn get_connector(&self, id: DrmObjectId) -> Result<&DrmConnector> { - 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 - } - - pub fn get_encoder(&self, id: DrmObjectId) -> Result<&DrmEncoder> { - self.get(id) - } } #[derive(Debug, Copy, Clone, Eq, PartialEq, Hash)] @@ -146,55 +87,3 @@ pub(crate) struct DrmObjectData { pub trait DrmObject: Any + Debug { fn object_type(&self) -> u32; } - -#[derive(Debug)] -pub struct DrmConnector { - pub encoder_id: DrmObjectId, - pub modes: Vec, - pub connector_type: u32, - pub connector_type_id: u32, - pub connection: DrmConnectorStatus, - pub mm_width: u32, - pub mm_height: u32, - pub subpixel: DrmSubpixelOrder, - pub driver_data: T, -} - -#[derive(Debug, Copy, Clone)] -#[repr(u32)] -pub enum DrmConnectorStatus { - Disconnected = 0, - Connected = 1, - Unknown = 2, -} - -#[derive(Debug, Copy, Clone)] -#[repr(u32)] -pub enum DrmSubpixelOrder { - Unknown = 0, - HorizontalRGB, - HorizontalBGR, - VerticalRGB, - VerticalBGR, - None, -} - -impl DrmObject for DrmConnector { - fn object_type(&self) -> u32 { - DRM_MODE_OBJECT_CONNECTOR - } -} - -// FIXME can we represent connector and encoder using a single struct? -#[derive(Debug)] -pub struct DrmEncoder { - pub crtc_id: DrmObjectId, - pub possible_crtcs: u32, - pub possible_clones: u32, -} - -impl DrmObject for DrmEncoder { - fn object_type(&self) -> u32 { - DRM_MODE_OBJECT_ENCODER - } -} diff --git a/drivers/graphics/ihdgd/src/device/scheme.rs b/drivers/graphics/ihdgd/src/device/scheme.rs index 4b2b9f7115..ac32e62af0 100644 --- a/drivers/graphics/ihdgd/src/device/scheme.rs +++ b/drivers/graphics/ihdgd/src/device/scheme.rs @@ -4,7 +4,8 @@ use std::alloc::{self, Layout}; use std::convert::TryInto; use std::ptr::{self, NonNull}; -use driver_graphics::objects::{DrmConnectorStatus, DrmObjectId, DrmObjects}; +use driver_graphics::connector::DrmConnectorStatus; +use driver_graphics::objects::{DrmObjectId, DrmObjects}; use driver_graphics::{ modeinfo_for_size, Buffer, CursorPlane, GraphicsAdapter, StandardProperties, }; diff --git a/drivers/graphics/vesad/src/scheme.rs b/drivers/graphics/vesad/src/scheme.rs index b858067c6a..e5c8eae997 100644 --- a/drivers/graphics/vesad/src/scheme.rs +++ b/drivers/graphics/vesad/src/scheme.rs @@ -2,7 +2,8 @@ use std::alloc::{self, Layout}; use std::convert::TryInto; use std::ptr::{self, NonNull}; -use driver_graphics::objects::{DrmConnectorStatus, DrmObjectId, DrmObjects}; +use driver_graphics::connector::DrmConnectorStatus; +use driver_graphics::objects::{DrmObjectId, DrmObjects}; use driver_graphics::{ modeinfo_for_size, Buffer, CursorPlane, GraphicsAdapter, StandardProperties, }; diff --git a/drivers/graphics/virtio-gpud/src/scheme.rs b/drivers/graphics/virtio-gpud/src/scheme.rs index 259a5fd942..ea77e24262 100644 --- a/drivers/graphics/virtio-gpud/src/scheme.rs +++ b/drivers/graphics/virtio-gpud/src/scheme.rs @@ -2,7 +2,8 @@ use std::fmt; use std::sync::Arc; use common::{dma::Dma, sgl}; -use driver_graphics::objects::{DrmConnectorStatus, DrmObjectId, DrmObjects}; +use driver_graphics::connector::DrmConnectorStatus; +use driver_graphics::objects::{DrmObjectId, DrmObjects}; use driver_graphics::{ modeinfo_for_size, Buffer as DrmBuffer, CursorPlane, GraphicsAdapter, GraphicsScheme, StandardProperties,