mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-08-30 15:43:08 -04:00
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>
This commit is contained in:
@@ -2,7 +2,10 @@
|
||||
|
||||
use kernel::{
|
||||
auxiliary,
|
||||
device::Core,
|
||||
device::{
|
||||
Core,
|
||||
DeviceContext, //
|
||||
},
|
||||
drm::{
|
||||
self,
|
||||
gem,
|
||||
@@ -62,7 +65,7 @@ fn probe<'bound>(
|
||||
) -> impl PinInit<Self::Data<'bound>, Error> + 'bound {
|
||||
let data = try_pin_init!(NovaData { adev: adev.into() });
|
||||
|
||||
let drm = drm::UnregisteredDevice::<Self>::new(adev.as_ref(), data)?;
|
||||
let drm = drm::UnregisteredDevice::<Self>::new(adev, data)?;
|
||||
let drm = drm::Registration::new_foreign_owned(drm, adev.as_ref(), 0)?;
|
||||
|
||||
Ok(Nova { drm: drm.into() })
|
||||
@@ -74,6 +77,7 @@ impl drm::Driver for NovaDriver {
|
||||
type Data = NovaData;
|
||||
type File = File;
|
||||
type Object<Ctx: drm::DeviceContext> = gem::Object<NovaObject, Ctx>;
|
||||
type ParentDevice<Ctx: DeviceContext> = auxiliary::Device<Ctx>;
|
||||
|
||||
const INFO: drm::DriverInfo = INFO;
|
||||
|
||||
|
||||
@@ -7,7 +7,8 @@
|
||||
},
|
||||
device::{
|
||||
Core,
|
||||
Device, //
|
||||
Device,
|
||||
DeviceContext, //
|
||||
},
|
||||
dma::{
|
||||
Device as DmaDevice,
|
||||
@@ -148,7 +149,7 @@ fn probe<'bound>(
|
||||
gpu_info,
|
||||
});
|
||||
|
||||
let tdev = drm::UnregisteredDevice::<TyrDrmDriver>::new(pdev.as_ref(), data)?;
|
||||
let tdev = drm::UnregisteredDevice::<TyrDrmDriver>::new(pdev, data)?;
|
||||
let tdev = drm::driver::Registration::new_foreign_owned(tdev, pdev.as_ref(), 0)?;
|
||||
|
||||
let driver = TyrPlatformDriverData {
|
||||
@@ -182,6 +183,7 @@ impl drm::Driver for TyrDrmDriver {
|
||||
type Data = TyrDrmDeviceData;
|
||||
type File = TyrDrmFileData;
|
||||
type Object<R: drm::DeviceContext> = drm::gem::shmem::Object<BoData, R>;
|
||||
type ParentDevice<Ctx: DeviceContext> = platform::Device<Ctx>;
|
||||
|
||||
const INFO: drm::DriverInfo = INFO;
|
||||
const FEAT_RENDER: bool = true;
|
||||
|
||||
@@ -178,7 +178,10 @@ const fn compute_features() -> u32 {
|
||||
/// 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 @@ pub fn new(dev: &device::Device, data: impl PinInit<T::Data, Error>) -> Result<S
|
||||
// - `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),
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -684,6 +684,7 @@ impl drm::Driver for KunitDriver {
|
||||
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 @@ fn create_drm_dev() -> Result<(faux::Registration, UnregisteredDevice<KunitDrive
|
||||
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))
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user