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