Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
1// SPDX-License-Identifier: GPL-2.0
2
3use crate::driver::{NovaDevice, NovaDriver};
4use crate::gem::NovaObject;
5use kernel::{
6 alloc::flags::*,
7 drm::{self, gem::BaseObject},
8 pci,
9 prelude::*,
10 uapi,
11};
12
13pub(crate) struct File;
14
15impl 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
23impl 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();
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}