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