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