rust: gem: Introduce DriverObject::Args
This is an associated type that may be used in order to specify a data-type to pass to gem objects when constructing them, allowing for drivers to more easily initialize their private-data for gem objects. Signed-off-by: Lyude Paul <lyude@redhat.com> Reviewed-by: Alice Ryhl <aliceryhl@google.com> Reviewed-by: Daniel Almeida <daniel.almeida@collabora.com> Reviewed-by: Janne Grunau <j@jananu.net> Tested-by: Deborah Brouwer <deborah.brouwer@collabora.com> Link: https://patch.msgid.link/20260316211646.650074-5-lyude@redhat.com [ Resolve merge conflicts in Tyr. - Danilo ] Signed-off-by: Danilo Krummrich <dakr@kernel.org>master
parent
e64b9cc293
commit
442ba16a5a
|
|
@ -19,8 +19,9 @@ pub(crate) struct NovaObject {}
|
|||
|
||||
impl gem::DriverObject for NovaObject {
|
||||
type Driver = NovaDriver;
|
||||
type Args = ();
|
||||
|
||||
fn new(_dev: &NovaDevice, _size: usize) -> impl PinInit<Self, Error> {
|
||||
fn new(_dev: &NovaDevice, _size: usize, _args: Self::Args) -> impl PinInit<Self, Error> {
|
||||
try_pin_init!(NovaObject {})
|
||||
}
|
||||
}
|
||||
|
|
@ -33,7 +34,7 @@ impl NovaObject {
|
|||
}
|
||||
let aligned_size = page::page_align(size).ok_or(EINVAL)?;
|
||||
|
||||
gem::Object::new(dev, aligned_size)
|
||||
gem::Object::new(dev, aligned_size, ())
|
||||
}
|
||||
|
||||
/// Look up a GEM object handle for a `File` and return an `ObjectRef` for it.
|
||||
|
|
|
|||
|
|
@ -16,8 +16,9 @@ pub(crate) struct TyrObject {}
|
|||
|
||||
impl gem::DriverObject for TyrObject {
|
||||
type Driver = TyrDrmDriver;
|
||||
type Args = ();
|
||||
|
||||
fn new(_dev: &TyrDrmDevice, _size: usize) -> impl PinInit<Self, Error> {
|
||||
fn new(_dev: &TyrDrmDevice, _size: usize, _args: ()) -> impl PinInit<Self, Error> {
|
||||
try_pin_init!(TyrObject {})
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -73,8 +73,15 @@ pub trait DriverObject: Sync + Send + Sized {
|
|||
/// Parent `Driver` for this object.
|
||||
type Driver: drm::Driver;
|
||||
|
||||
/// The data type to use for passing arguments to [`DriverObject::new`].
|
||||
type Args;
|
||||
|
||||
/// Create a new driver data object for a GEM object of a given size.
|
||||
fn new(dev: &drm::Device<Self::Driver>, size: usize) -> impl PinInit<Self, Error>;
|
||||
fn new(
|
||||
dev: &drm::Device<Self::Driver>,
|
||||
size: usize,
|
||||
args: Self::Args,
|
||||
) -> impl PinInit<Self, Error>;
|
||||
|
||||
/// Open a new handle to an existing object, associated with a File.
|
||||
fn open(_obj: &<Self::Driver as drm::Driver>::Object, _file: &DriverFile<Self>) -> Result {
|
||||
|
|
@ -241,11 +248,11 @@ impl<T: DriverObject> Object<T> {
|
|||
};
|
||||
|
||||
/// Create a new GEM object.
|
||||
pub fn new(dev: &drm::Device<T::Driver>, size: usize) -> Result<ARef<Self>> {
|
||||
pub fn new(dev: &drm::Device<T::Driver>, size: usize, args: T::Args) -> Result<ARef<Self>> {
|
||||
let obj: Pin<KBox<Self>> = KBox::pin_init(
|
||||
try_pin_init!(Self {
|
||||
obj: Opaque::new(bindings::drm_gem_object::default()),
|
||||
data <- T::new(dev, size),
|
||||
data <- T::new(dev, size, args),
|
||||
}),
|
||||
GFP_KERNEL,
|
||||
)?;
|
||||
|
|
|
|||
Loading…
Reference in New Issue