projects/linux·blob master · refs

77 lines · 1.8 KiB

1// SPDX-License-Identifier: GPL-2.0
2
3use crate::driver::{NovaDevice, NovaDriver};
4use crate::gem::NovaObject;
5use 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
19pub(crate) struct File;
20
21impl 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
29impl 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}