Currently the nova-drm stub driver doesn't really interact with a real device, so it doesn't have any registration data and has no way to call into nova-core.
To allow for this add a DrmRegData type which will hold a reference to the NovaCoreApi associated with the auxbus device. Signed-off-by: Alistair Popple <[email protected]> Suggested-by: Danilo Krummrich <[email protected]> --- drivers/gpu/drm/nova/driver.rs | 16 ++++++++++++++-- drivers/gpu/drm/nova/file.rs | 13 ++++++------- 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/drivers/gpu/drm/nova/driver.rs b/drivers/gpu/drm/nova/driver.rs index 739690bc2db5..3ae719540e4d 100644 --- a/drivers/gpu/drm/nova/driver.rs +++ b/drivers/gpu/drm/nova/driver.rs @@ -1,5 +1,7 @@ // SPDX-License-Identifier: GPL-2.0 +use core::pin::Pin; + use kernel::{ auxiliary, device::{ @@ -17,6 +19,7 @@ use crate::file::File; use crate::gem::NovaObject; +use nova_core::api::NovaCoreApi; pub(crate) struct NovaDriver; @@ -26,6 +29,12 @@ pub(crate) struct Nova<'bound> { _reg: drm::Registration<'bound, NovaDriver>, } +/// DRM registration data, accessible from ioctl handlers via the registration guard. +pub(crate) struct DrmRegData<'bound> { + #[allow(dead_code)] + pub(crate) api: Pin<&'bound NovaCoreApi<'bound>>, +} + /// Convienence type alias for the DRM device type for this driver pub(crate) type NovaDevice<Ctx = drm::Normal> = drm::Device<NovaDriver, Ctx>; @@ -60,9 +69,12 @@ fn probe<'bound>( _info: &'bound Self::IdInfo, ) -> impl PinInit<Self::Data<'bound>, Error> + 'bound { let drm = drm::UnregisteredDevice::<Self>::new(adev, Ok(()))?; + let reg_data = DrmRegData { + api: NovaCoreApi::of(adev)?, + }; // SAFETY: `reg` is stored in `Nova` and dropped when the driver is unbound; it is // never forgotten. - let reg = unsafe { drm::Registration::new(adev.as_ref(), drm, (), 0)? }; + let reg = unsafe { drm::Registration::new(adev.as_ref(), drm, reg_data, 0)? }; Ok(Nova { drm: reg.device().into(), @@ -74,7 +86,7 @@ fn probe<'bound>( #[vtable] impl drm::Driver for NovaDriver { type Data = (); - type RegistrationData<'a> = (); + type RegistrationData<'a> = DrmRegData<'a>; type File = File; type Object = gem::Object<NovaObject>; type ParentDevice<Ctx: DeviceContext> = auxiliary::Device<Ctx>; diff --git a/drivers/gpu/drm/nova/file.rs b/drivers/gpu/drm/nova/file.rs index 298c02bacb4b..855b6ffe696f 100644 --- a/drivers/gpu/drm/nova/file.rs +++ b/drivers/gpu/drm/nova/file.rs @@ -1,11 +1,10 @@ // SPDX-License-Identifier: GPL-2.0 -use crate::driver::{NovaDevice, NovaDriver}; +use crate::driver::{DrmRegData, NovaDevice, NovaDriver}; use crate::gem::NovaObject; use kernel::{ alloc::flags::*, auxiliary, - device::Bound, drm::{ self, gem::BaseObject, @@ -30,12 +29,12 @@ impl File { /// IOCTL: get_param: Query GPU / driver metadata. pub(crate) fn get_param( dev: &NovaDevice<Registered>, - _reg_data: &(), + _reg_data: &DrmRegData<'_>, getparam: &mut uapi::drm_nova_getparam, _file: &drm::File<File>, ) -> Result<u32> { - let adev: &auxiliary::Device<Bound> = dev.as_ref(); - let pdev: &pci::Device<Bound> = adev.parent().try_into()?; + let adev: &auxiliary::Device<_> = dev.as_ref(); + let pdev: &pci::Device<_> = adev.parent().try_into()?; let value = match getparam.param as u32 { uapi::NOVA_GETPARAM_VRAM_BAR_SIZE => pdev.resource_len(1)?, @@ -50,7 +49,7 @@ pub(crate) fn get_param( /// IOCTL: gem_create: Create a new DRM GEM object. pub(crate) fn gem_create( dev: &NovaDevice<Registered>, - _reg_data: &(), + _reg_data: &DrmRegData<'_>, req: &mut uapi::drm_nova_gem_create, file: &drm::File<File>, ) -> Result<u32> { @@ -64,7 +63,7 @@ pub(crate) fn gem_create( /// IOCTL: gem_info: Query GEM metadata. pub(crate) fn gem_info( _dev: &NovaDevice<Registered>, - _reg_data: &(), + _reg_data: &DrmRegData<'_>, req: &mut uapi::drm_nova_gem_info, file: &drm::File<File>, ) -> Result<u32> { -- 2.54.0
