From 853e050fc89a07174524c4b207d36979c0e0b4e6 Mon Sep 17 00:00:00 2001 From: bjorn3 <17426603+bjorn3@users.noreply.github.com> Date: Sun, 10 May 2026 12:17:35 +0200 Subject: [PATCH 1/5] drivers/graphics/driver-graphics: Use unzip in get_object_properties_data --- .../driver-graphics/src/kms/properties.rs | 26 +++++++------------ 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/drivers/graphics/driver-graphics/src/kms/properties.rs b/drivers/graphics/driver-graphics/src/kms/properties.rs index 37075db2d4..c603f58a5b 100644 --- a/drivers/graphics/driver-graphics/src/kms/properties.rs +++ b/drivers/graphics/driver-graphics/src/kms/properties.rs @@ -55,25 +55,19 @@ impl KmsObjects { match object { KmsObject::Crtc(crtc) => { let crtc = crtc.lock().unwrap(); - let props = &crtc.properties; - Ok(( - props.iter().map(|prop| prop.id.0).collect::>(), - props - .iter() - .map(|prop| (prop.getter)(&crtc)) - .collect::>(), - )) + Ok(crtc + .properties + .iter() + .map(|prop| (prop.id.0, (prop.getter)(&crtc))) + .unzip()) } KmsObject::Connector(connector) => { let connector = connector.lock().unwrap(); - let props = &connector.properties; - Ok(( - props.iter().map(|prop| prop.id.0).collect::>(), - props - .iter() - .map(|prop| (prop.getter)(&connector)) - .collect::>(), - )) + Ok(connector + .properties + .iter() + .map(|prop| (prop.id.0, (prop.getter)(&connector))) + .unzip()) } KmsObject::Encoder(_) | KmsObject::Property(_) From 009a9130d203d5bcc9224da143b870e90d3897c0 Mon Sep 17 00:00:00 2001 From: bjorn3 <17426603+bjorn3@users.noreply.github.com> Date: Sun, 10 May 2026 14:54:47 +0200 Subject: [PATCH 2/5] drivers/graphics: Report DRM_CAP_DUMB_PREFERRED_DEPTH to clients --- drivers/graphics/ihdgd/src/device/scheme.rs | 4 +++- drivers/graphics/vesad/src/scheme.rs | 4 +++- drivers/graphics/virtio-gpud/src/scheme.rs | 5 +++-- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/drivers/graphics/ihdgd/src/device/scheme.rs b/drivers/graphics/ihdgd/src/device/scheme.rs index 7a90d6933e..337314da71 100644 --- a/drivers/graphics/ihdgd/src/device/scheme.rs +++ b/drivers/graphics/ihdgd/src/device/scheme.rs @@ -6,7 +6,8 @@ use driver_graphics::kms::objects::{ }; use driver_graphics::{Buffer, CursorPlane, Damage, GraphicsAdapter}; use drm_sys::{ - DRM_CAP_DUMB_BUFFER, DRM_CAP_DUMB_PREFER_SHADOW, DRM_CLIENT_CAP_CURSOR_PLANE_HOTSPOT, + DRM_CAP_DUMB_BUFFER, DRM_CAP_DUMB_PREFERRED_DEPTH, DRM_CAP_DUMB_PREFER_SHADOW, + DRM_CLIENT_CAP_CURSOR_PLANE_HOTSPOT, }; use syscall::error::EINVAL; @@ -50,6 +51,7 @@ impl GraphicsAdapter for Device { fn get_cap(&self, cap: u32) -> syscall::Result { match cap { DRM_CAP_DUMB_BUFFER => Ok(1), + DRM_CAP_DUMB_PREFERRED_DEPTH => Ok(24), DRM_CAP_DUMB_PREFER_SHADOW => Ok(1), _ => Err(syscall::Error::new(EINVAL)), } diff --git a/drivers/graphics/vesad/src/scheme.rs b/drivers/graphics/vesad/src/scheme.rs index 9c9713b229..4b8b31ce83 100644 --- a/drivers/graphics/vesad/src/scheme.rs +++ b/drivers/graphics/vesad/src/scheme.rs @@ -7,7 +7,8 @@ use driver_graphics::kms::connector::{KmsConnectorDriver, KmsConnectorStatus}; use driver_graphics::kms::objects::{KmsCrtc, KmsCrtcState, KmsObjectId, KmsObjects}; use driver_graphics::{Buffer, CursorPlane, Damage, GraphicsAdapter}; use drm_sys::{ - DRM_CAP_DUMB_BUFFER, DRM_CAP_DUMB_PREFER_SHADOW, DRM_CLIENT_CAP_CURSOR_PLANE_HOTSPOT, + DRM_CAP_DUMB_BUFFER, DRM_CAP_DUMB_PREFERRED_DEPTH, DRM_CAP_DUMB_PREFER_SHADOW, + DRM_CLIENT_CAP_CURSOR_PLANE_HOTSPOT, }; use syscall::{EINVAL, PAGE_SIZE}; @@ -61,6 +62,7 @@ impl GraphicsAdapter for FbAdapter { fn get_cap(&self, cap: u32) -> syscall::Result { match cap { DRM_CAP_DUMB_BUFFER => Ok(1), + DRM_CAP_DUMB_PREFERRED_DEPTH => Ok(24), DRM_CAP_DUMB_PREFER_SHADOW => Ok(0), _ => Err(syscall::Error::new(EINVAL)), } diff --git a/drivers/graphics/virtio-gpud/src/scheme.rs b/drivers/graphics/virtio-gpud/src/scheme.rs index 0f88a66e91..2dd07681f5 100644 --- a/drivers/graphics/virtio-gpud/src/scheme.rs +++ b/drivers/graphics/virtio-gpud/src/scheme.rs @@ -6,8 +6,8 @@ use driver_graphics::kms::connector::{KmsConnectorDriver, KmsConnectorStatus}; use driver_graphics::kms::objects::{KmsCrtc, KmsCrtcState, KmsObjectId, KmsObjects}; use driver_graphics::{Buffer as DrmBuffer, CursorPlane, Damage, GraphicsAdapter, GraphicsScheme}; use drm_sys::{ - DRM_CAP_CURSOR_HEIGHT, DRM_CAP_CURSOR_WIDTH, DRM_CAP_DUMB_BUFFER, DRM_CAP_DUMB_PREFER_SHADOW, - DRM_CLIENT_CAP_CURSOR_PLANE_HOTSPOT, + DRM_CAP_CURSOR_HEIGHT, DRM_CAP_CURSOR_WIDTH, DRM_CAP_DUMB_BUFFER, DRM_CAP_DUMB_PREFERRED_DEPTH, + DRM_CAP_DUMB_PREFER_SHADOW, DRM_CLIENT_CAP_CURSOR_PLANE_HOTSPOT, }; use syscall::{EINVAL, PAGE_SIZE}; @@ -293,6 +293,7 @@ impl<'a> GraphicsAdapter for VirtGpuAdapter<'a> { fn get_cap(&self, cap: u32) -> syscall::Result { match cap { DRM_CAP_DUMB_BUFFER => Ok(1), + DRM_CAP_DUMB_PREFERRED_DEPTH => Ok(24), DRM_CAP_DUMB_PREFER_SHADOW => Ok(0), DRM_CAP_CURSOR_WIDTH => Ok(64), DRM_CAP_CURSOR_HEIGHT => Ok(64), From e93431cac00b04d09e00571d8b30bb58006d04cb Mon Sep 17 00:00:00 2001 From: bjorn3 <17426603+bjorn3@users.noreply.github.com> Date: Sun, 10 May 2026 15:09:34 +0200 Subject: [PATCH 3/5] drivers/graphics/driver-graphics: Replace From and TryFrom impls with KmsObjectKind trait --- .../driver-graphics/src/kms/objects.rs | 34 +++++++++---------- 1 file changed, 16 insertions(+), 18 deletions(-) diff --git a/drivers/graphics/driver-graphics/src/kms/objects.rs b/drivers/graphics/driver-graphics/src/kms/objects.rs index d8befafdc9..d7407cf965 100644 --- a/drivers/graphics/driver-graphics/src/kms/objects.rs +++ b/drivers/graphics/driver-graphics/src/kms/objects.rs @@ -41,20 +41,17 @@ impl KmsObjects { objects } - pub(super) fn add>>(&mut self, data: U) -> KmsObjectId { + pub(super) fn add>(&mut self, data: U) -> KmsObjectId { let id = self.next_id; - self.objects.insert(id, data.into()); + self.objects.insert(id, data.into_object()); self.next_id.0 += 1; id } - pub(super) fn get<'a, U: 'a>(&'a self, id: KmsObjectId) -> Result<&'a U> - where - &'a U: TryFrom<&'a KmsObject>, - { + pub(super) fn get>(&self, id: KmsObjectId) -> Result<&U> { let object = self.objects.get(&id).ok_or(Error::new(EINVAL))?; - if let Ok(object) = object.try_into() { + if let Some(object) = U::try_from_object(object) { Ok(object) } else { Err(Error::new(EINVAL)) @@ -142,6 +139,11 @@ impl From for u64 { } } +pub(super) trait KmsObjectKind { + fn into_object(self) -> KmsObject; + fn try_from_object(object: &KmsObject) -> Option<&Self>; +} + macro_rules! define_object_kinds { (<$T:ident> $( $variant:ident($data:ty) = $type:ident, @@ -160,19 +162,15 @@ macro_rules! define_object_kinds { } $( - impl<$T: GraphicsAdapter> From<$data> for KmsObject<$T> { - fn from(value: $data) -> Self { - Self::$variant(value) + impl<$T: GraphicsAdapter> KmsObjectKind<$T> for $data { + fn into_object(self) -> KmsObject<$T> { + KmsObject::$variant(self) } - } - impl<'a, $T: GraphicsAdapter> TryFrom<&'a KmsObject<$T>> for &'a $data { - type Error = (); - - fn try_from(value: &'a KmsObject) -> Result { - match value { - KmsObject::$variant(data) => Ok(data), - _ => Err(()), + fn try_from_object(object: &KmsObject<$T>) -> Option<&$data> { + match object { + KmsObject::$variant(data) => Some(data), + _ => None, } } } From 3f4ad965de6bc641105824b989cf15a6bae82e7c Mon Sep 17 00:00:00 2001 From: bjorn3 <17426603+bjorn3@users.noreply.github.com> Date: Sun, 10 May 2026 15:22:15 +0200 Subject: [PATCH 4/5] drivers/graphics/driver-graphics: Report ACTIVE property for CRTCs --- drivers/graphics/driver-graphics/src/kms/objects.rs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/drivers/graphics/driver-graphics/src/kms/objects.rs b/drivers/graphics/driver-graphics/src/kms/objects.rs index d7407cf965..b46bc7d5d7 100644 --- a/drivers/graphics/driver-graphics/src/kms/objects.rs +++ b/drivers/graphics/driver-graphics/src/kms/objects.rs @@ -11,7 +11,7 @@ use syscall::{Error, Result, EINVAL}; use crate::kms::connector::{KmsConnector, KmsEncoder}; use crate::kms::properties::{ - define_object_props, init_standard_props, KmsBlob, KmsProperty, KmsPropertyData, + define_object_props, init_standard_props, KmsBlob, KmsProperty, KmsPropertyData, ACTIVE, }; use crate::GraphicsAdapter; @@ -221,7 +221,11 @@ impl Clone for KmsCrtcState { } } -define_object_props!(object, KmsCrtc {}); +define_object_props!(object, KmsCrtc { + ACTIVE { + get => u64::from(object.state.mode.is_some()), + } +}); #[derive(Debug)] pub struct KmsFramebuffer { From e4462ccc09718f5fb7410e30d76e44d0b066056f Mon Sep 17 00:00:00 2001 From: bjorn3 <17426603+bjorn3@users.noreply.github.com> Date: Sun, 10 May 2026 15:28:39 +0200 Subject: [PATCH 5/5] drivers/graphics/driver-graphics: Report dummy TILE property for connectors --- drivers/graphics/driver-graphics/src/kms/connector.rs | 9 ++++++++- drivers/graphics/driver-graphics/src/kms/properties.rs | 1 + 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/drivers/graphics/driver-graphics/src/kms/connector.rs b/drivers/graphics/driver-graphics/src/kms/connector.rs index 0a15d42b4b..6675c662b0 100644 --- a/drivers/graphics/driver-graphics/src/kms/connector.rs +++ b/drivers/graphics/driver-graphics/src/kms/connector.rs @@ -9,7 +9,7 @@ use drm_sys::{ use syscall::Result; use crate::kms::objects::{KmsObjectId, KmsObjects}; -use crate::kms::properties::{define_object_props, KmsPropertyData, CRTC_ID, DPMS, EDID}; +use crate::kms::properties::{define_object_props, KmsPropertyData, CRTC_ID, DPMS, EDID, TILE}; use crate::GraphicsAdapter; impl KmsObjects { @@ -125,6 +125,13 @@ define_object_props!(object, KmsConnector { DPMS { get => object.state.dpms as u64, } + TILE { + get => { + // FIXME set this property once we support DP MST + let _ = object; + 0 + }, + } CRTC_ID { get => u64::from(object.state.crtc_id.0), } diff --git a/drivers/graphics/driver-graphics/src/kms/properties.rs b/drivers/graphics/driver-graphics/src/kms/properties.rs index c603f58a5b..a76669cd73 100644 --- a/drivers/graphics/driver-graphics/src/kms/properties.rs +++ b/drivers/graphics/driver-graphics/src/kms/properties.rs @@ -193,6 +193,7 @@ define_properties! { Suspend = u64::from(DRM_MODE_DPMS_SUSPEND), Off = u64::from(DRM_MODE_DPMS_OFF), } [], + TILE: blob [immutable], // CRTC ACTIVE: range { 0,1 } [atomic],