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