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