Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
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}