Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
1// SPDX-License-Identifier: GPL-2.0
2
3use kernel::{
4 drm,
5 drm::{gem, gem::BaseObject},
6 prelude::*,
7 sync::aref::ARef,
8};
9
10use crate::{
11 driver::{NovaDevice, NovaDriver},
12 file::File,
13};
14
15/// GEM Object inner driver data
16#[pin_data]
17pub(crate) struct NovaObject {}
18
19impl gem::DriverObject for NovaObject {
20 type Driver = NovaDriver;
21
22 fn new(_dev: &NovaDevice, _size: usize) -> impl PinInit<Self, Error> {
23 try_pin_init!(NovaObject {})
24 }
25}
26
27impl NovaObject {
28 /// Create a new DRM GEM object.
29 pub(crate) fn new(dev: &NovaDevice, size: usize) -> Result<ARef<gem::Object<Self>>> {
30 let aligned_size = size.next_multiple_of(1 << 12);
31
32 if size == 0 || size > aligned_size {
33 return Err(EINVAL);
34 }
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}