| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- // SPDX-License-Identifier: GPL-2.0
- use crate::driver::{NovaDevice, NovaDriver};
- use crate::gem::NovaObject;
- use kernel::{
- alloc::flags::*,
- drm::{self, gem::BaseObject},
- 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,
- getparam: &mut uapi::drm_nova_getparam,
- _file: &drm::File<File>,
- ) -> Result<u32> {
- let adev = &dev.adev;
- let parent = adev.parent();
- let pdev: &pci::Device = 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,
- 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,
- 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)
- }
- }
|