From fc2d098f70adef6ba820f7ae97e4113865c5843e Mon Sep 17 00:00:00 2001 From: bjorn3 <17426603+bjorn3@users.noreply.github.com> Date: Thu, 14 May 2026 18:37:55 +0200 Subject: [PATCH] drivers/graphics/driver-graphics: Move property ioctls to a separate module --- .../graphics/driver-graphics/src/ioctl/mod.rs | 92 ++--------------- .../driver-graphics/src/ioctl/property.rs | 99 +++++++++++++++++++ 2 files changed, 107 insertions(+), 84 deletions(-) create mode 100644 drivers/graphics/driver-graphics/src/ioctl/property.rs diff --git a/drivers/graphics/driver-graphics/src/ioctl/mod.rs b/drivers/graphics/driver-graphics/src/ioctl/mod.rs index 6731c43246..1c050d9b42 100644 --- a/drivers/graphics/driver-graphics/src/ioctl/mod.rs +++ b/drivers/graphics/driver-graphics/src/ioctl/mod.rs @@ -4,19 +4,14 @@ use std::mem; use std::sync::Arc; use drm_fourcc::DrmFourcc; -use drm_sys::{ - drm_mode_property_enum, DRM_MODE_PROP_ATOMIC, DRM_MODE_PROP_BITMASK, DRM_MODE_PROP_BLOB, - DRM_MODE_PROP_ENUM, DRM_MODE_PROP_IMMUTABLE, DRM_MODE_PROP_OBJECT, DRM_MODE_PROP_RANGE, - DRM_MODE_PROP_SIGNED_RANGE, -}; use syscall::{Error, EINVAL, ENOENT}; use crate::kms::objects::{KmsObjectId, KmsObjects, KmsRect}; -use crate::kms::properties::KmsPropertyKind; use crate::{Buffer, Damage, DrmHandle, GraphicsAdapter, VtState, MAP_FAKE_OFFSET_MULTIPLIER}; mod cursor; mod framebuffer; +mod property; pub(crate) fn call_ioctl( adapter: &mut T, @@ -229,78 +224,12 @@ pub(crate) fn call_ioctl( data.set_prop_values_ptr(&prop_vals); Ok(0) }), - ipc::MODE_GET_PROPERTY => ipc::DrmModeGetProperty::with(payload, |mut data| { - let property = objects.get_property(KmsObjectId(data.prop_id()))?; - data.set_name(property.name.0); - let mut flags = 0; - if property.immutable { - flags |= DRM_MODE_PROP_IMMUTABLE; - } - if property.atomic { - flags |= DRM_MODE_PROP_ATOMIC; - } - match &property.kind { - &KmsPropertyKind::Range(start, end) => { - data.set_flags(flags | DRM_MODE_PROP_RANGE); - data.set_values_ptr(&[start, end]); - data.set_enum_blob_ptr(&[]); - } - KmsPropertyKind::Enum(variants) => { - data.set_flags(flags | DRM_MODE_PROP_ENUM); - data.set_values_ptr( - &variants.iter().map(|&(_, value)| value).collect::>(), - ); - data.set_enum_blob_ptr( - &variants - .iter() - .map(|&(name, value)| drm_mode_property_enum { - name: name.0, - value, - }) - .collect::>(), - ); - } - KmsPropertyKind::Blob => { - data.set_flags(flags | DRM_MODE_PROP_BLOB); - data.set_values_ptr(&[]); - data.set_enum_blob_ptr(&[]); - } - KmsPropertyKind::Bitmask(bitmask_flags) => { - data.set_flags(flags | DRM_MODE_PROP_BITMASK); - data.set_values_ptr( - &bitmask_flags - .iter() - .map(|&(_, value)| value) - .collect::>(), - ); - data.set_enum_blob_ptr( - &bitmask_flags - .iter() - .map(|&(name, value)| drm_mode_property_enum { - name: name.0, - value, - }) - .collect::>(), - ); - } - KmsPropertyKind::Object { type_ } => { - data.set_flags(flags | DRM_MODE_PROP_OBJECT); - data.set_values_ptr(&[u64::from(*type_)]); - data.set_enum_blob_ptr(&[]); - } - &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(&[]); - } - } - Ok(0) - }), - ipc::MODE_GET_PROP_BLOB => ipc::DrmModeGetBlob::with(payload, |mut data| { - let blob = objects.get_blob(KmsObjectId(data.blob_id()))?; - data.set_data(&blob); - Ok(0) + ipc::MODE_GET_PROPERTY => ipc::DrmModeGetProperty::with(payload, |data| { + property::mode_get_property(objects, data) }), + ipc::MODE_GET_PROP_BLOB => { + ipc::DrmModeGetBlob::with(payload, |data| property::mode_get_prop_blob(objects, data)) + } ipc::MODE_GET_FB => ipc::DrmModeFbCmd::with(payload, |data| { framebuffer::mode_get_fb(objects, handle, data) }), @@ -427,13 +356,8 @@ pub(crate) fn call_ioctl( ipc::MODE_ADD_FB2 => ipc::DrmModeFbCmd2::with(payload, |data| { framebuffer::mode_add_fb2(adapter, objects, handle, data) }), - ipc::MODE_OBJ_GET_PROPERTIES => ipc::DrmModeObjGetProperties::with(payload, |mut data| { - let (props, prop_vals) = - objects.get_object_properties_data(KmsObjectId(data.obj_id()))?; - data.set_props_ptr(&props); - data.set_prop_values_ptr(&prop_vals); - data.set_obj_type(objects.object_type(KmsObjectId(data.obj_id()))?); - Ok(0) + ipc::MODE_OBJ_GET_PROPERTIES => ipc::DrmModeObjGetProperties::with(payload, |data| { + property::mode_obj_get_properties(objects, data) }), ipc::MODE_CURSOR2 => ipc::DrmModeCursor2::with(payload, |data| { cursor::mode_cursor2(adapter, vts, handle, data) diff --git a/drivers/graphics/driver-graphics/src/ioctl/property.rs b/drivers/graphics/driver-graphics/src/ioctl/property.rs new file mode 100644 index 0000000000..b79d782e96 --- /dev/null +++ b/drivers/graphics/driver-graphics/src/ioctl/property.rs @@ -0,0 +1,99 @@ +use drm_sys::{ + drm_mode_property_enum, DRM_MODE_PROP_ATOMIC, DRM_MODE_PROP_BITMASK, DRM_MODE_PROP_BLOB, + DRM_MODE_PROP_ENUM, DRM_MODE_PROP_IMMUTABLE, DRM_MODE_PROP_OBJECT, DRM_MODE_PROP_RANGE, + DRM_MODE_PROP_SIGNED_RANGE, +}; +use syscall::Error; + +use crate::kms::objects::{KmsObjectId, KmsObjects}; +use crate::kms::properties::KmsPropertyKind; +use crate::GraphicsAdapter; + +pub(super) fn mode_get_property( + objects: &mut KmsObjects, + mut data: redox_ioctl::drm::DrmModeGetProperty<'_>, +) -> Result { + let property = objects.get_property(KmsObjectId(data.prop_id()))?; + data.set_name(property.name.0); + let mut flags = 0; + if property.immutable { + flags |= DRM_MODE_PROP_IMMUTABLE; + } + if property.atomic { + flags |= DRM_MODE_PROP_ATOMIC; + } + match &property.kind { + &KmsPropertyKind::Range(start, end) => { + data.set_flags(flags | DRM_MODE_PROP_RANGE); + data.set_values_ptr(&[start, end]); + data.set_enum_blob_ptr(&[]); + } + KmsPropertyKind::Enum(variants) => { + data.set_flags(flags | DRM_MODE_PROP_ENUM); + data.set_values_ptr(&variants.iter().map(|&(_, value)| value).collect::>()); + data.set_enum_blob_ptr( + &variants + .iter() + .map(|&(name, value)| drm_mode_property_enum { + name: name.0, + value, + }) + .collect::>(), + ); + } + KmsPropertyKind::Blob => { + data.set_flags(flags | DRM_MODE_PROP_BLOB); + data.set_values_ptr(&[]); + data.set_enum_blob_ptr(&[]); + } + KmsPropertyKind::Bitmask(bitmask_flags) => { + data.set_flags(flags | DRM_MODE_PROP_BITMASK); + data.set_values_ptr( + &bitmask_flags + .iter() + .map(|&(_, value)| value) + .collect::>(), + ); + data.set_enum_blob_ptr( + &bitmask_flags + .iter() + .map(|&(name, value)| drm_mode_property_enum { + name: name.0, + value, + }) + .collect::>(), + ); + } + KmsPropertyKind::Object { type_ } => { + data.set_flags(flags | DRM_MODE_PROP_OBJECT); + data.set_values_ptr(&[u64::from(*type_)]); + data.set_enum_blob_ptr(&[]); + } + &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(&[]); + } + } + Ok(0) +} + +pub(super) fn mode_get_prop_blob( + objects: &mut KmsObjects, + mut data: redox_ioctl::drm::DrmModeGetBlob<'_>, +) -> Result { + let blob = objects.get_blob(KmsObjectId(data.blob_id()))?; + data.set_data(&blob); + Ok(0) +} + +pub(super) fn mode_obj_get_properties( + objects: &mut KmsObjects, + mut data: redox_ioctl::drm::DrmModeObjGetProperties<'_>, +) -> Result { + let (props, prop_vals) = objects.get_object_properties_data(KmsObjectId(data.obj_id()))?; + data.set_props_ptr(&props); + data.set_prop_values_ptr(&prop_vals); + data.set_obj_type(objects.object_type(KmsObjectId(data.obj_id()))?); + Ok(0) +}