at v6.16-rc6 69 lines 2.0 kB view raw
1// SPDX-License-Identifier: GPL-2.0 2 3use kernel::{auxiliary, c_str, device::Core, drm, drm::gem, drm::ioctl, prelude::*, types::ARef}; 4 5use crate::file::File; 6use crate::gem::NovaObject; 7 8pub(crate) struct NovaDriver { 9 #[expect(unused)] 10 drm: ARef<drm::Device<Self>>, 11} 12 13/// Convienence type alias for the DRM device type for this driver 14pub(crate) type NovaDevice = drm::Device<NovaDriver>; 15 16#[pin_data] 17pub(crate) struct NovaData { 18 pub(crate) adev: ARef<auxiliary::Device>, 19} 20 21const INFO: drm::DriverInfo = drm::DriverInfo { 22 major: 0, 23 minor: 0, 24 patchlevel: 0, 25 name: c_str!("nova"), 26 desc: c_str!("Nvidia Graphics"), 27}; 28 29const NOVA_CORE_MODULE_NAME: &CStr = c_str!("NovaCore"); 30const AUXILIARY_NAME: &CStr = c_str!("nova-drm"); 31 32kernel::auxiliary_device_table!( 33 AUX_TABLE, 34 MODULE_AUX_TABLE, 35 <NovaDriver as auxiliary::Driver>::IdInfo, 36 [( 37 auxiliary::DeviceId::new(NOVA_CORE_MODULE_NAME, AUXILIARY_NAME), 38 () 39 )] 40); 41 42impl auxiliary::Driver for NovaDriver { 43 type IdInfo = (); 44 const ID_TABLE: auxiliary::IdTable<Self::IdInfo> = &AUX_TABLE; 45 46 fn probe(adev: &auxiliary::Device<Core>, _info: &Self::IdInfo) -> Result<Pin<KBox<Self>>> { 47 let data = try_pin_init!(NovaData { adev: adev.into() }); 48 49 let drm = drm::Device::<Self>::new(adev.as_ref(), data)?; 50 drm::Registration::new_foreign_owned(&drm, adev.as_ref(), 0)?; 51 52 Ok(KBox::new(Self { drm }, GFP_KERNEL)?.into()) 53 } 54} 55 56#[vtable] 57impl drm::Driver for NovaDriver { 58 type Data = NovaData; 59 type File = File; 60 type Object = gem::Object<NovaObject>; 61 62 const INFO: drm::DriverInfo = INFO; 63 64 kernel::declare_drm_ioctls! { 65 (NOVA_GETPARAM, drm_nova_getparam, ioctl::RENDER_ALLOW, File::get_param), 66 (NOVA_GEM_CREATE, drm_nova_gem_create, ioctl::AUTH | ioctl::RENDER_ALLOW, File::gem_create), 67 (NOVA_GEM_INFO, drm_nova_gem_info, ioctl::AUTH | ioctl::RENDER_ALLOW, File::gem_info), 68 } 69}