xref: /linux/drivers/gpu/drm/nova/gem.rs (revision 570f7e331f5febb30f1384817463c7e42b65ca7d)
1 // SPDX-License-Identifier: GPL-2.0
2 
3 use kernel::{
4     drm,
5     drm::{
6         gem,
7         gem::BaseObject, //
8     },
9     page,
10     prelude::*,
11     sync::aref::ARef,
12 };
13 
14 use crate::{
15     driver::{NovaDevice, NovaDriver},
16     file::File,
17 };
18 
19 /// GEM Object inner driver data
20 #[pin_data]
21 pub(crate) struct NovaObject {}
22 
23 impl gem::DriverObject for NovaObject {
24     type Driver = NovaDriver;
25     type Args = ();
26 
27     fn new(_dev: &NovaDevice, _size: usize, _args: Self::Args) -> impl PinInit<Self, Error> {
28         try_pin_init!(NovaObject {})
29     }
30 }
31 
32 impl NovaObject {
33     /// Create a new DRM GEM object.
34     pub(crate) fn new(dev: &NovaDevice, size: usize) -> Result<ARef<gem::Object<Self>>> {
35         if size == 0 {
36             return Err(EINVAL);
37         }
38         let aligned_size = page::page_align(size).ok_or(EINVAL)?;
39 
40         gem::Object::<Self>::new(dev, aligned_size, ())
41     }
42 
43     /// Look up a GEM object handle for a `File` and return an `ObjectRef` for it.
44     #[inline]
45     pub(crate) fn lookup_handle(
46         file: &drm::File<File>,
47         handle: u32,
48     ) -> Result<ARef<gem::Object<Self>>> {
49         gem::Object::lookup_handle(file, handle)
50     }
51 }
52