File Index
Files and directories
Sign in
FILE

file.rs

File preview with syntax highlighting.

linux-6.19.14/drivers/gpu/drm/nova/file.rs RUST
 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}
~/ Read-only file preview.