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