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