// SPDX-License-Identifier: GPL-2.0
use kernel::{auxiliary, c_str, device::Core, drm, drm::gem, drm::ioctl, prelude::*, types::ARef};
use crate ::file::File;
use crate ::gem::NovaObject;
pub (crate ) struct NovaDriver {
#[ expect(unused)]
drm: ARef<drm::Device<Self >>,
}
/// Convienence type alias for the DRM device type for this driver
pub (crate ) type NovaDevice = drm::Device<NovaDriver>;
#[ pin_data]
pub (crate ) struct NovaData {
pub (crate ) adev: ARef<auxiliary::Device>,
}
const INFO: drm::DriverInfo = drm::DriverInfo {
major: 0 ,
minor: 0 ,
patchlevel: 0 ,
name: c_str!("nova" ),
desc: c_str!("Nvidia Graphics" ),
};
const NOVA_CORE_MODULE_NAME: &CStr = c_str!("NovaCore" );
const AUXILIARY_NAME: &CStr = c_str!("nova-drm" );
kernel::auxiliary_device_table!(
AUX_TABLE,
MODULE_AUX_TABLE,
<NovaDriver as auxiliary::Driver>::IdInfo,
[(
auxiliary::DeviceId::new(NOVA_CORE_MODULE_NAME, AUXILIARY_NAME),
()
)]
);
impl auxiliary::Driver for NovaDriver {
type IdInfo = ();
const ID_TABLE: auxiliary::IdTable<Self ::IdInfo> = &AUX_TABLE;
fn probe(adev: &auxiliary::Device<Core>, _info: &Self ::IdInfo) -> Result<Pin<KBox<Self >>> {
let data = try_pin_init!(NovaData { adev: adev.into() });
let drm = drm::Device::<Self >::new(adev.as_ref(), data)?;
drm::Registration::new_foreign_owned(&drm, adev.as_ref(), 0 )?;
Ok(KBox::new(Self { drm }, GFP_KERNEL)?.into())
}
}
#[ vtable]
impl drm::Driver for NovaDriver {
type Data = NovaData;
type File = File;
type Object = gem::Object<NovaObject>;
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),
}
}
Messung V0.5 in Prozent C=98 H=100 G=98
¤ Dauer der Verarbeitung: 0.10 Sekunden
(vorverarbeitet am 2026-06-19)
¤
*© Formatika GbR, Deutschland