summaryrefslogtreecommitdiff
path: root/rust/kernel/drm
diff options
context:
space:
mode:
authorDanilo Krummrich <dakr@kernel.org>2026-06-28 16:53:24 +0200
committerDanilo Krummrich <dakr@kernel.org>2026-07-12 15:56:52 +0200
commit49e27d58a06d7edda4791b9fa818a536dd34b7e5 (patch)
tree10bb2ce70d15b7daa0801ae2a439989a4a355e7a /rust/kernel/drm
parent893f39dadaa172c0f869e5b138f2cfdd851df781 (diff)
downloadlinux-next-49e27d58a06d7edda4791b9fa818a536dd34b7e5.tar.gz
linux-next-49e27d58a06d7edda4791b9fa818a536dd34b7e5.zip
rust: drm: Add Driver::ParentDevice associated type
Add a ParentDevice associated type to the Driver trait, allowing each DRM driver to declare its parent bus device type (e.g. auxiliary::Device, platform::Device). Change UnregisteredDevice::new() to take &T::ParentDevice<Bound>, ensuring at the type level that the DRM device's parent matches the declared bus device type. Reviewed-by: Lyude Paul <lyude@redhat.com> Reviewed-by: Alexandre Courbot <acourbot@nvidia.com> Tested-by: Deborah Brouwer <deborah.brouwer@collabora.com> Link: https://patch.msgid.link/20260628145406.2107056-5-dakr@kernel.org Signed-off-by: Danilo Krummrich <dakr@kernel.org>
Diffstat (limited to 'rust/kernel/drm')
-rw-r--r--rust/kernel/drm/device.rs7
-rw-r--r--rust/kernel/drm/driver.rs3
-rw-r--r--rust/kernel/drm/gem/shmem.rs4
3 files changed, 10 insertions, 4 deletions
diff --git a/rust/kernel/drm/device.rs b/rust/kernel/drm/device.rs
index 35ff9c6942d8..343c0ef63c6c 100644
--- a/rust/kernel/drm/device.rs
+++ b/rust/kernel/drm/device.rs
@@ -178,7 +178,10 @@ impl<T: drm::Driver> UnregisteredDevice<T> {
/// Create a new `UnregisteredDevice` for a `drm::Driver`.
///
/// This can be used to create a [`Registration`](kernel::drm::Registration).
- pub fn new(dev: &device::Device, data: impl PinInit<T::Data, Error>) -> Result<Self> {
+ pub fn new(
+ dev: &T::ParentDevice<device::Bound>,
+ data: impl PinInit<T::Data, Error>,
+ ) -> Result<Self> {
// `__drm_dev_alloc` uses `kmalloc()` to allocate memory, hence ensure a `kmalloc()`
// compatible `Layout`.
let layout = Kmalloc::aligned_layout(Layout::new::<Device<T, Normal>>());
@@ -195,7 +198,7 @@ impl<T: drm::Driver> UnregisteredDevice<T> {
// - `dev` is valid by its type invarants,
let raw_drm: *mut Device<T, Normal> = unsafe {
bindings::__drm_dev_alloc(
- dev.as_raw(),
+ dev.as_ref().as_raw(),
&alloc_vtable,
layout.size(),
mem::offset_of!(Device<T, Normal>, dev),
diff --git a/rust/kernel/drm/driver.rs b/rust/kernel/drm/driver.rs
index 25f7e233884d..802e7fc13e30 100644
--- a/rust/kernel/drm/driver.rs
+++ b/rust/kernel/drm/driver.rs
@@ -116,6 +116,9 @@ pub trait Driver {
/// The type used to represent a DRM File (client)
type File: drm::file::DriverFile;
+ /// The bus device type of the parent device that the DRM device is associated with.
+ type ParentDevice<Ctx: device::DeviceContext>: device::AsBusDevice<Ctx>;
+
/// Driver metadata
const INFO: DriverInfo;
diff --git a/rust/kernel/drm/gem/shmem.rs b/rust/kernel/drm/gem/shmem.rs
index 52de59b14dad..cbcfc7e4edb6 100644
--- a/rust/kernel/drm/gem/shmem.rs
+++ b/rust/kernel/drm/gem/shmem.rs
@@ -684,6 +684,7 @@ mod tests {
type Data = KunitData;
type File = KunitFile;
type Object<Ctx: DeviceContext> = Object<KunitObject, Ctx>;
+ type ParentDevice<Ctx: device::DeviceContext> = faux::Device<Ctx>;
const INFO: drm::DriverInfo = INFO;
const IOCTLS: &'static [drm::ioctl::DrmIoctlDescriptor] = &[];
@@ -694,8 +695,7 @@ mod tests {
let data = try_pin_init!(KunitData {});
let reg = faux::Registration::new(c"Kunit", None)?;
let fdev = reg.as_ref();
- let dev = fdev.as_ref();
- let drm = UnregisteredDevice::new(dev, data)?;
+ let drm = UnregisteredDevice::new(fdev, data)?;
Ok((reg, drm))
}