xref: /linux/drivers/gpu/drm/nova/driver.rs (revision ab93e0dd72c37d378dd936f031ffb83ff2bd87ce)
1 // SPDX-License-Identifier: GPL-2.0
2 
3 use kernel::{auxiliary, c_str, device::Core, drm, drm::gem, drm::ioctl, prelude::*, types::ARef};
4 
5 use crate::file::File;
6 use crate::gem::NovaObject;
7 
8 pub(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
14 pub(crate) type NovaDevice = drm::Device<NovaDriver>;
15 
16 #[pin_data]
17 pub(crate) struct NovaData {
18     pub(crate) adev: ARef<auxiliary::Device>,
19 }
20 
21 const 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 
29 const NOVA_CORE_MODULE_NAME: &CStr = c_str!("NovaCore");
30 const AUXILIARY_NAME: &CStr = c_str!("nova-drm");
31 
32 kernel::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 
42 impl 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]
57 impl 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 }
70