1 // SPDX-License-Identifier: GPL-2.0 2 3 use kernel::{ 4 drm, 5 drm::{ 6 gem, 7 gem::BaseObject, // 8 }, 9 page, 10 prelude::*, 11 sync::aref::ARef, 12 }; 13 14 use crate::{ 15 driver::{NovaDevice, NovaDriver}, 16 file::File, 17 }; 18 19 /// GEM Object inner driver data 20 #[pin_data] 21 pub(crate) struct NovaObject {} 22 23 impl 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 32 impl 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 } 52