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 crate::uapi::{GemCreate, GemInfo, Getparam};
6use kernel::{
7 alloc::flags::*,
8 drm::{self, gem::BaseObject},
9 pci,
10 prelude::*,
11 types::Opaque,
12 uapi,
13};
14
15pub(crate) struct File;
16
17impl drm::file::DriverFile for File {
18 type Driver = NovaDriver;
19
20 fn open(_dev: &NovaDevice) -> Result<Pin<KBox<Self>>> {
21 Ok(KBox::new(Self, GFP_KERNEL)?.into())
22 }
23}
24
25impl File {
26 /// IOCTL: get_param: Query GPU / driver metadata.
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 getparam.set_value(value);
43
44 Ok(0)
45 }
46
47 /// IOCTL: gem_create: Create a new DRM GEM object.
48 pub(crate) fn gem_create(
49 dev: &NovaDevice,
50 req: &Opaque<uapi::drm_nova_gem_create>,
51 file: &drm::File<File>,
52 ) -> Result<u32> {
53 let req: &GemCreate = req.into();
54 let obj = NovaObject::new(dev, req.size().try_into()?)?;
55
56 req.set_handle(obj.create_handle(file)?);
57
58 Ok(0)
59 }
60
61 /// IOCTL: gem_info: Query GEM metadata.
62 pub(crate) fn gem_info(
63 _dev: &NovaDevice,
64 req: &Opaque<uapi::drm_nova_gem_info>,
65 file: &drm::File<File>,
66 ) -> Result<u32> {
67 let req: &GemInfo = req.into();
68 let bo = NovaObject::lookup_handle(file, req.handle())?;
69
70 req.set_size(bo.size().try_into()?);
71
72 Ok(0)
73 }
74}