1 // SPDX-License-Identifier: GPL-2.0 2 3 use crate::driver::{NovaDevice, NovaDriver}; 4 use crate::gem::NovaObject; 5 use kernel::{ 6 alloc::flags::*, 7 auxiliary, 8 device::Bound, 9 drm::{ 10 self, 11 gem::BaseObject, 12 Registered, // 13 }, 14 pci, 15 prelude::*, 16 uapi, 17 }; 18 19 pub(crate) struct File; 20 21 impl drm::file::DriverFile for File { 22 type Driver = NovaDriver; 23 24 fn open(_dev: &NovaDevice) -> Result<Pin<KBox<Self>>> { 25 Ok(KBox::new(Self, GFP_KERNEL)?.into()) 26 } 27 } 28 29 impl File { 30 /// IOCTL: get_param: Query GPU / driver metadata. 31 pub(crate) fn get_param( 32 dev: &NovaDevice<Registered>, 33 _reg_data: &(), 34 getparam: &mut uapi::drm_nova_getparam, 35 _file: &drm::File<File>, 36 ) -> Result<u32> { 37 let adev: &auxiliary::Device<Bound> = dev.as_ref(); 38 let pdev: &pci::Device<Bound> = adev.parent().try_into()?; 39 40 let value = match getparam.param as u32 { 41 uapi::NOVA_GETPARAM_VRAM_BAR_SIZE => pdev.resource_len(1)?, 42 _ => return Err(EINVAL), 43 }; 44 45 getparam.value = Into::<u64>::into(value); 46 47 Ok(0) 48 } 49 50 /// IOCTL: gem_create: Create a new DRM GEM object. 51 pub(crate) fn gem_create( 52 dev: &NovaDevice<Registered>, 53 _reg_data: &(), 54 req: &mut uapi::drm_nova_gem_create, 55 file: &drm::File<File>, 56 ) -> Result<u32> { 57 let obj = NovaObject::new(dev, req.size.try_into()?)?; 58 59 req.handle = obj.create_handle(file)?; 60 61 Ok(0) 62 } 63 64 /// IOCTL: gem_info: Query GEM metadata. 65 pub(crate) fn gem_info( 66 _dev: &NovaDevice<Registered>, 67 _reg_data: &(), 68 req: &mut uapi::drm_nova_gem_info, 69 file: &drm::File<File>, 70 ) -> Result<u32> { 71 let bo = NovaObject::lookup_handle(file, req.handle)?; 72 73 req.size = bo.size().try_into()?; 74 75 Ok(0) 76 } 77 } 78