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