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