// SPDX-License-Identifier: GPL-2.0 use kernel::{ auxiliary, device::Core, drm::{ self, gem, ioctl, // }, prelude::*, sync::aref::ARef, // }; use crate::file::File; use crate::gem::NovaObject; pub(crate) struct NovaDriver { #[expect(unused)] drm: ARef>, } /// Convienence type alias for the DRM device type for this driver pub(crate) type NovaDevice = drm::Device; #[pin_data] pub(crate) struct NovaData { pub(crate) adev: ARef, } const INFO: drm::DriverInfo = drm::DriverInfo { major: 0, minor: 0, patchlevel: 0, name: c"nova", desc: c"Nvidia Graphics", }; const NOVA_CORE_MODULE_NAME: &CStr = c"NovaCore"; const AUXILIARY_NAME: &CStr = c"nova-drm"; kernel::auxiliary_device_table!( AUX_TABLE, MODULE_AUX_TABLE, ::IdInfo, [( auxiliary::DeviceId::new(NOVA_CORE_MODULE_NAME, AUXILIARY_NAME), () )] ); impl auxiliary::Driver for NovaDriver { type IdInfo = (); const ID_TABLE: auxiliary::IdTable = &AUX_TABLE; fn probe(adev: &auxiliary::Device, _info: &Self::IdInfo) -> impl PinInit { let data = try_pin_init!(NovaData { adev: adev.into() }); let drm = drm::Device::::new(adev.as_ref(), data)?; drm::Registration::new_foreign_owned(&drm, adev.as_ref(), 0)?; Ok(Self { drm }) } } #[vtable] impl drm::Driver for NovaDriver { type Data = NovaData; type File = File; type Object = gem::Object; const INFO: drm::DriverInfo = INFO; kernel::declare_drm_ioctls! { (NOVA_GETPARAM, drm_nova_getparam, ioctl::RENDER_ALLOW, File::get_param), (NOVA_GEM_CREATE, drm_nova_gem_create, ioctl::AUTH | ioctl::RENDER_ALLOW, File::gem_create), (NOVA_GEM_INFO, drm_nova_gem_info, ioctl::AUTH | ioctl::RENDER_ALLOW, File::gem_info), } }