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