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 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. 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 getparam.set_value(value); 43 44 Ok(0) 45 } 46 47 /// IOCTL: gem_create: Create a new DRM GEM object. 48 pub(crate) fn gem_create( 49 dev: &NovaDevice, 50 req: &Opaque<uapi::drm_nova_gem_create>, 51 file: &drm::File<File>, 52 ) -> Result<u32> { 53 let req: &GemCreate = req.into(); 54 let obj = NovaObject::new(dev, req.size().try_into()?)?; 55 56 req.set_handle(obj.create_handle(file)?); 57 58 Ok(0) 59 } 60 61 /// IOCTL: gem_info: Query GEM metadata. 62 pub(crate) fn gem_info( 63 _dev: &NovaDevice, 64 req: &Opaque<uapi::drm_nova_gem_info>, 65 file: &drm::File<File>, 66 ) -> Result<u32> { 67 let req: &GemInfo = req.into(); 68 let bo = NovaObject::lookup_handle(file, req.handle())?; 69 70 req.set_size(bo.size().try_into()?); 71 72 Ok(0) 73 } 74 } 75