projects/linux·blob master · refs

51 lines · 1.1 KiB

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