77 lines · 1.8 KB · Rust
RawDownload
// SPDX-License-Identifier: GPL-2.0 use crate::driver::{NovaDevice, NovaDriver};use crate::gem::NovaObject;use kernel::{    alloc::flags::*,    auxiliary,    device::Bound,    drm::{        self,        gem::BaseObject,        Registered, //    },    pci,    prelude::*,    uapi,}; pub(crate) struct File; impl drm::file::DriverFile for File {    type Driver = NovaDriver;     fn open(_dev: &NovaDevice) -> Result<Pin<KBox<Self>>> {        Ok(KBox::new(Self, GFP_KERNEL)?.into())    }} impl File {    /// IOCTL: get_param: Query GPU / driver metadata.    pub(crate) fn get_param(        dev: &NovaDevice<Registered>,        _reg_data: &(),        getparam: &mut uapi::drm_nova_getparam,        _file: &drm::File<File>,    ) -> Result<u32> {        let adev: &auxiliary::Device<Bound> = dev.as_ref();        let pdev: &pci::Device<Bound> = adev.parent().try_into()?;         let value = match getparam.param as u32 {            uapi::NOVA_GETPARAM_VRAM_BAR_SIZE => pdev.resource_len(1)?,            _ => return Err(EINVAL),        };         getparam.value = Into::<u64>::into(value);         Ok(0)    }     /// IOCTL: gem_create: Create a new DRM GEM object.    pub(crate) fn gem_create(        dev: &NovaDevice<Registered>,        _reg_data: &(),        req: &mut uapi::drm_nova_gem_create,        file: &drm::File<File>,    ) -> Result<u32> {        let obj = NovaObject::new(dev, req.size.try_into()?)?;         req.handle = obj.create_handle(file)?;         Ok(0)    }     /// IOCTL: gem_info: Query GEM metadata.    pub(crate) fn gem_info(        _dev: &NovaDevice<Registered>,        _reg_data: &(),        req: &mut uapi::drm_nova_gem_info,        file: &drm::File<File>,    ) -> Result<u32> {        let bo = NovaObject::lookup_handle(file, req.handle)?;         req.size = bo.size().try_into()?;         Ok(0)    }}