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