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