xref: /linux/drivers/gpu/drm/nova/gem.rs (revision 4348796233e736147e2e79c58784d0a9fb48867d)
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 
23     fn new(_dev: &NovaDevice, _size: usize) -> impl PinInit<Self, Error> {
24         try_pin_init!(NovaObject {})
25     }
26 }
27 
28 impl NovaObject {
29     /// Create a new DRM GEM object.
30     pub(crate) fn new(dev: &NovaDevice, size: usize) -> Result<ARef<gem::Object<Self>>> {
31         if size == 0 {
32             return Err(EINVAL);
33         }
34         let aligned_size = page::page_align(size).ok_or(EINVAL)?;
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