diff options
| author | Danilo Krummrich <dakr@kernel.org> | 2026-06-28 16:53:24 +0200 |
|---|---|---|
| committer | Danilo Krummrich <dakr@kernel.org> | 2026-07-12 15:56:52 +0200 |
| commit | 49e27d58a06d7edda4791b9fa818a536dd34b7e5 (patch) | |
| tree | 10bb2ce70d15b7daa0801ae2a439989a4a355e7a /rust/kernel/drm | |
| parent | 893f39dadaa172c0f869e5b138f2cfdd851df781 (diff) | |
| download | linux-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.rs | 7 | ||||
| -rw-r--r-- | rust/kernel/drm/driver.rs | 3 | ||||
| -rw-r--r-- | rust/kernel/drm/gem/shmem.rs | 4 |
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)) } |
