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