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