From 79e9e0987d1bc34cb3dc757c9a1b35e7b4e558e2 Mon Sep 17 00:00:00 2001 From: bjorn3 <17426603+bjorn3@users.noreply.github.com> Date: Thu, 19 Mar 2026 22:26:55 +0100 Subject: [PATCH] drivers/graphics: Move property values into individual objects --- .../driver-graphics/src/kms/connector.rs | 9 ++++- .../driver-graphics/src/kms/objects.rs | 10 ++++- .../driver-graphics/src/kms/properties.rs | 38 ++++++++++++++----- drivers/graphics/driver-graphics/src/lib.rs | 11 +++--- drivers/graphics/ihdgd/src/device/scheme.rs | 8 +--- drivers/graphics/vesad/src/scheme.rs | 8 +--- drivers/graphics/virtio-gpud/src/scheme.rs | 10 ++--- 7 files changed, 56 insertions(+), 38 deletions(-) diff --git a/drivers/graphics/driver-graphics/src/kms/connector.rs b/drivers/graphics/driver-graphics/src/kms/connector.rs index ed36692d08..aff4e88f92 100644 --- a/drivers/graphics/driver-graphics/src/kms/connector.rs +++ b/drivers/graphics/driver-graphics/src/kms/connector.rs @@ -2,10 +2,13 @@ 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_TYPE_PREFERRED}; +use drm_sys::{ + drm_mode_modeinfo, DRM_MODE_CONNECTOR_Unknown, DRM_MODE_DPMS_ON, DRM_MODE_TYPE_PREFERRED, +}; use syscall::Result; use crate::kms::objects::{KmsObjectId, KmsObjects}; +use crate::kms::properties::{DPMS, EDID}; use crate::GraphicsAdapter; impl KmsObjects { @@ -35,6 +38,7 @@ impl KmsObjects { mm_width: 0, mm_height: 0, subpixel: DrmSubpixelOrder::Unknown, + properties: vec![(EDID, 0), (DPMS, DRM_MODE_DPMS_ON as u64)], driver_data, })); self.connectors.push(connector_id); @@ -68,7 +72,7 @@ impl KmsObjects { } #[derive(Debug)] -pub struct KmsConnector { +pub struct KmsConnector { pub encoder_id: KmsObjectId, pub modes: Vec, pub connector_type: u32, @@ -77,6 +81,7 @@ pub struct KmsConnector { pub mm_width: u32, pub mm_height: u32, pub subpixel: DrmSubpixelOrder, + pub properties: Vec<(KmsObjectId, u64)>, pub driver_data: T, } diff --git a/drivers/graphics/driver-graphics/src/kms/objects.rs b/drivers/graphics/driver-graphics/src/kms/objects.rs index 0ac387cd32..55b6f7fdb4 100644 --- a/drivers/graphics/driver-graphics/src/kms/objects.rs +++ b/drivers/graphics/driver-graphics/src/kms/objects.rs @@ -45,7 +45,6 @@ impl KmsObjects { id, Arc::new(KmsObject { kind: Box::new(data.into()), - properties: Mutex::new(vec![]), }), ); self.next_id.0 += 1; @@ -78,6 +77,7 @@ impl KmsObjects { fb_id: KmsObjectId::INVALID, gamma_size: 0, mode: None, + properties: vec![], driver_data, })); self.crtcs.push(id); @@ -149,7 +149,12 @@ impl From for u64 { #[derive(Debug)] pub(crate) struct KmsObject { kind: Box>, - pub(crate) properties: Mutex>, +} + +impl KmsObject { + pub(super) fn kind(&self) -> &KmsObjectKind { + &self.kind + } } macro_rules! define_object_kinds { @@ -207,6 +212,7 @@ pub struct KmsCrtc { pub fb_id: KmsObjectId, pub gamma_size: u32, pub mode: Option, + pub properties: Vec<(KmsObjectId, u64)>, pub driver_data: T, } diff --git a/drivers/graphics/driver-graphics/src/kms/properties.rs b/drivers/graphics/driver-graphics/src/kms/properties.rs index 296ded5831..b9205b75b7 100644 --- a/drivers/graphics/driver-graphics/src/kms/properties.rs +++ b/drivers/graphics/driver-graphics/src/kms/properties.rs @@ -49,25 +49,43 @@ impl KmsObjects { self.get(id) } - 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: 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() { - if *prop == property { - *val = value; + match object.kind() { + super::objects::KmsObjectKind::Crtc(crtc) => { + for (prop, val) in crtc.lock().unwrap().properties.iter_mut() { + if *prop == property { + *val = value; + } + } } + super::objects::KmsObjectKind::Connector(connector) => { + for (prop, val) in connector.lock().unwrap().properties.iter_mut() { + if *prop == property { + *val = value; + } + } + } + super::objects::KmsObjectKind::Encoder(_) + | super::objects::KmsObjectKind::Property(_) + | super::objects::KmsObjectKind::Framebuffer(_) + | super::objects::KmsObjectKind::Blob(_) => unreachable!(), } } pub fn get_object_properties_data(&self, id: KmsObjectId) -> Result<(Vec, Vec)> { let object = self.objects.get(&id).ok_or(Error::new(EINVAL))?; - let props = object.properties.lock().unwrap(); + let props = match object.kind() { + super::objects::KmsObjectKind::Crtc(crtc) => crtc.lock().unwrap().properties.clone(), + super::objects::KmsObjectKind::Connector(connector) => { + connector.lock().unwrap().properties.clone() + } + super::objects::KmsObjectKind::Encoder(_) => vec![], + super::objects::KmsObjectKind::Property(_) => vec![], + super::objects::KmsObjectKind::Framebuffer(_) => vec![], + super::objects::KmsObjectKind::Blob(_) => vec![], + }; Ok(( props.iter().map(|&(id, _)| id.0).collect::>(), props.iter().map(|&(_, value)| value).collect::>(), diff --git a/drivers/graphics/driver-graphics/src/lib.rs b/drivers/graphics/driver-graphics/src/lib.rs index 9bc0882e2c..78275fd9c7 100644 --- a/drivers/graphics/driver-graphics/src/lib.rs +++ b/drivers/graphics/driver-graphics/src/lib.rs @@ -634,17 +634,18 @@ impl SchemeSync for GraphicsSchemeInner { .unwrap(); data.set_encoders_ptr(&[connector.encoder_id.0]); data.set_modes_ptr(&connector.modes); - let (props, prop_vals) = self - .objects - .get_object_properties_data(KmsObjectId(data.connector_id()))?; - data.set_props_ptr(&props); - data.set_prop_values_ptr(&prop_vals); data.set_connector_type(data.connector_type()); data.set_connector_type_id(data.connector_type_id()); data.set_connection(connector.connection as u32); data.set_mm_width(connector.mm_width); data.set_mm_height(connector.mm_width); data.set_subpixel(connector.subpixel as u32); + drop(connector); + let (props, prop_vals) = self + .objects + .get_object_properties_data(KmsObjectId(data.connector_id()))?; + data.set_props_ptr(&props); + data.set_prop_values_ptr(&prop_vals); Ok(0) }), ipc::MODE_GET_PROPERTY => ipc::DrmModeGetProperty::with(payload, |mut data| { diff --git a/drivers/graphics/ihdgd/src/device/scheme.rs b/drivers/graphics/ihdgd/src/device/scheme.rs index 5dd093c421..01634c154e 100644 --- a/drivers/graphics/ihdgd/src/device/scheme.rs +++ b/drivers/graphics/ihdgd/src/device/scheme.rs @@ -7,11 +7,8 @@ use std::sync::Mutex; use driver_graphics::kms::connector::KmsConnectorStatus; use driver_graphics::kms::objects::{self, KmsCrtc, KmsObjectId, KmsObjects}; -use driver_graphics::kms::properties::DPMS; use driver_graphics::{Buffer, CursorPlane, Damage, GraphicsAdapter}; -use drm_sys::{ - drm_mode_modeinfo, DRM_CAP_DUMB_BUFFER, DRM_CLIENT_CAP_CURSOR_PLANE_HOTSPOT, DRM_MODE_DPMS_ON, -}; +use drm_sys::{drm_mode_modeinfo, DRM_CAP_DUMB_BUFFER, DRM_CLIENT_CAP_CURSOR_PLANE_HOTSPOT}; use syscall::{error::EINVAL, PAGE_SIZE}; use super::Device; @@ -41,8 +38,7 @@ impl GraphicsAdapter for Device { for (framebuffer_id, _) in self.framebuffers.iter().enumerate() { let crtc = objects.add_crtc(()); - let connector = objects.add_connector(Connector { framebuffer_id }, &[crtc]); - objects.add_object_property(connector, DPMS, DRM_MODE_DPMS_ON.into()); + objects.add_connector(Connector { framebuffer_id }, &[crtc]); } } diff --git a/drivers/graphics/vesad/src/scheme.rs b/drivers/graphics/vesad/src/scheme.rs index d51ac723a8..156acd8bde 100644 --- a/drivers/graphics/vesad/src/scheme.rs +++ b/drivers/graphics/vesad/src/scheme.rs @@ -5,11 +5,8 @@ use std::sync::Mutex; use driver_graphics::kms::connector::KmsConnectorStatus; use driver_graphics::kms::objects::{self, KmsCrtc, KmsObjectId, KmsObjects}; -use driver_graphics::kms::properties::DPMS; use driver_graphics::{Buffer, CursorPlane, Damage, GraphicsAdapter}; -use drm_sys::{ - drm_mode_modeinfo, DRM_CAP_DUMB_BUFFER, DRM_CLIENT_CAP_CURSOR_PLANE_HOTSPOT, DRM_MODE_DPMS_ON, -}; +use drm_sys::{drm_mode_modeinfo, DRM_CAP_DUMB_BUFFER, DRM_CLIENT_CAP_CURSOR_PLANE_HOTSPOT}; use syscall::{EINVAL, PAGE_SIZE}; #[derive(Debug)] @@ -43,7 +40,7 @@ impl GraphicsAdapter for FbAdapter { for (framebuffer_id, framebuffer) in self.framebuffers.iter().enumerate() { let crtc = objects.add_crtc(()); - let connector = objects.add_connector( + objects.add_connector( Connector { width: framebuffer.width as u32, height: framebuffer.height as u32, @@ -51,7 +48,6 @@ impl GraphicsAdapter for FbAdapter { }, &[crtc], ); - objects.add_object_property(connector, DPMS, DRM_MODE_DPMS_ON.into()); } } diff --git a/drivers/graphics/virtio-gpud/src/scheme.rs b/drivers/graphics/virtio-gpud/src/scheme.rs index b550f060fa..eabd34fbda 100644 --- a/drivers/graphics/virtio-gpud/src/scheme.rs +++ b/drivers/graphics/virtio-gpud/src/scheme.rs @@ -4,11 +4,11 @@ use std::sync::{Arc, Mutex}; use common::{dma::Dma, sgl}; use driver_graphics::kms::connector::KmsConnectorStatus; use driver_graphics::kms::objects::{self, KmsCrtc, KmsObjectId, KmsObjects}; -use driver_graphics::kms::properties::{DPMS, EDID}; +use driver_graphics::kms::properties::EDID; use driver_graphics::{Buffer as DrmBuffer, CursorPlane, Damage, GraphicsAdapter, GraphicsScheme}; use drm_sys::{ drm_mode_modeinfo, DRM_CAP_CURSOR_HEIGHT, DRM_CAP_CURSOR_WIDTH, DRM_CAP_DUMB_BUFFER, - DRM_CLIENT_CAP_CURSOR_PLANE_HOTSPOT, DRM_MODE_DPMS_ON, + DRM_CLIENT_CAP_CURSOR_PLANE_HOTSPOT, }; use syscall::{EINVAL, PAGE_SIZE}; @@ -287,11 +287,7 @@ impl<'a> GraphicsAdapter for VirtGpuAdapter<'a> { for display_id in 0..self.config.num_scanouts.get() { let crtc = objects.add_crtc(()); - let connector = objects.add_connector(VirtGpuConnector { display_id }, &[crtc]); - if self.has_edid { - objects.add_object_property(connector, EDID, 0); - } - objects.add_object_property(connector, DPMS, DRM_MODE_DPMS_ON.into()); + objects.add_connector(VirtGpuConnector { display_id }, &[crtc]); } }