diff --git a/drivers/gpu/drm/rvkms/connector.rs b/drivers/gpu/drm/rvkms/connector.rs index 40f84d38437ee1d191eb6ff45818807ea7aeae68..576afe0c080b047cf223e138b70b4281a662e4b3 100644 --- a/drivers/gpu/drm/rvkms/connector.rs +++ b/drivers/gpu/drm/rvkms/connector.rs @@ -1,7 +1,7 @@ // TODO: License and stuff // Contain's rvkms's drm_connector implementation -use super::{RvkmsDriver, RvkmsDevice, MAX_RES, DEFAULT_RES}; +use super::{Rvkms, RvkmsDevice, MAX_RES, DEFAULT_RES}; use kernel::{ prelude::*, drm::{ @@ -24,15 +24,13 @@ pub(crate) struct DriverConnector { pub(crate) type Connector = connector::Connector<DriverConnector>; impl connector::DriverConnector for DriverConnector { - type Initializer = impl PinInit<Self, Error>; - type State = ConnectorState; - type Driver = RvkmsDriver; + type Driver = Rvkms; type Args = (); - fn new(dev: &Device<Self::Driver>, args: Self::Args) -> Self::Initializer { + fn new(dev: &Device<Self::Driver>, args: Self::Args) -> impl PinInit<Self, Error> { try_pin_init!(Self { _p: PhantomPinned }) } diff --git a/drivers/gpu/drm/rvkms/crtc.rs b/drivers/gpu/drm/rvkms/crtc.rs index dd55ef2ebc72db54ebde0195bec4d2656f0ac079..3c8ff0a992d1bcb0669fbbd9b058909501b4811f 100644 --- a/drivers/gpu/drm/rvkms/crtc.rs +++ b/drivers/gpu/drm/rvkms/crtc.rs @@ -1,7 +1,7 @@ // TODO: License and stuff // Contain's rvkms's drm_crtc implementation use core::marker::PhantomPinned; -use super::{RvkmsDriver, plane::*}; +use super::{Rvkms, plane::*}; use kernel::{ prelude::*, drm::{ @@ -12,7 +12,6 @@ use kernel::{ ModeObject, } }, - device::RawDevice }; pub(crate) type Crtc = crtc::Crtc<DriverCrtc>; @@ -25,15 +24,13 @@ pub(crate) struct DriverCrtc { #[vtable] impl crtc::DriverCrtc for DriverCrtc { - type Initializer = impl PinInit<Self, Error>; - type Args = (); type State = CrtcState; - type Driver = RvkmsDriver; + type Driver = Rvkms; - fn new(device: &Device<Self::Driver>, args: Self::Args) -> Self::Initializer { + fn new(device: &Device<Self::Driver>, args: Self::Args) -> impl PinInit<Self, Error> { try_pin_init!(Self { _p: PhantomPinned }) } diff --git a/drivers/gpu/drm/rvkms/encoder.rs b/drivers/gpu/drm/rvkms/encoder.rs index 5c145ecfcb710c8067e92f7470ca54420f313fda..1174d512e48d48e79a97170a0f429cc790de66b8 100644 --- a/drivers/gpu/drm/rvkms/encoder.rs +++ b/drivers/gpu/drm/rvkms/encoder.rs @@ -5,7 +5,7 @@ use kernel::{ types::ARef, }; use crate::{ - RvkmsDriver, + Rvkms, connector::Connector, }; @@ -19,13 +19,11 @@ pub(crate) struct DriverEncoder { pub(crate) type Encoder = kms::encoder::Encoder<DriverEncoder>; impl kms::encoder::DriverEncoder for DriverEncoder { - type Initializer = impl PinInit<Self, Error>; - - type Driver = RvkmsDriver; + type Driver = Rvkms; type Args = ARef<Connector>; - fn new(device: &Device<Self::Driver>, args: Self::Args) -> Self::Initializer { + fn new(device: &Device<Self::Driver>, args: Self::Args) -> impl PinInit<Self, Error> { try_pin_init!(Self { connector: args, _p: PhantomPinned diff --git a/drivers/gpu/drm/rvkms/file.rs b/drivers/gpu/drm/rvkms/file.rs index 24b1b53b7823897f7e8b74d488f24faa8be2809d..baa9297673ecceb02b0a20964b32737a6e461c9f 100644 --- a/drivers/gpu/drm/rvkms/file.rs +++ b/drivers/gpu/drm/rvkms/file.rs @@ -1,4 +1,4 @@ -use super::RvkmsDriver; +use super::Rvkms; use kernel::{ drm::{ @@ -9,14 +9,14 @@ use kernel::{ }; use core::option::*; -pub(crate) struct File(); +pub(crate) struct File; impl drm::file::DriverFile for File { - type Driver = RvkmsDriver; + type Driver = Rvkms; fn open(device: &DrmDevice<Self::Driver>) -> Result<Pin<Box<Self>>> { pr_info!("Someone opened a file! But I do not yet know which one...\n"); - Ok(Box::into_pin(Box::try_new(Self())?)) + Box::pin_init(init!(File { }), GFP_KERNEL) } } diff --git a/drivers/gpu/drm/rvkms/gem.rs b/drivers/gpu/drm/rvkms/gem.rs index b789a1c2170c7df65993b8032b3cfa5c85e88de3..950ef33758657de297e1a92517e030ec0ae9d2dd 100644 --- a/drivers/gpu/drm/rvkms/gem.rs +++ b/drivers/gpu/drm/rvkms/gem.rs @@ -1,4 +1,4 @@ -use crate::{RvkmsDriver, RvkmsDevice}; +use crate::{Rvkms, RvkmsDevice}; use core::sync::atomic::{AtomicU64, Ordering}; use kernel::{ drm::{self, gem}, @@ -17,9 +17,7 @@ pub(crate) struct DriverObject { pub(crate) type Object = gem::shmem::Object<DriverObject>; impl gem::BaseDriverObject<Object> for DriverObject { - type Initializer = impl PinInit<Self, Error>; - - fn new(dev: &RvkmsDevice, size: usize) -> Self::Initializer { + fn new(dev: &RvkmsDevice, size: usize) -> impl PinInit<Self, Error> { let id = GEM_ID.fetch_add(1, Ordering::Relaxed); pr_debug!("DriverObject::new id={id}\n"); @@ -28,5 +26,5 @@ impl gem::BaseDriverObject<Object> for DriverObject { } impl gem::shmem::DriverObject for DriverObject { - type Driver = RvkmsDriver; + type Driver = Rvkms; } diff --git a/drivers/gpu/drm/rvkms/output.rs b/drivers/gpu/drm/rvkms/output.rs index 822dc9e8e863a2f11c00f100a26cd537ccd15d9f..c352cb7900f2668b23d1a3103a49c0e159bb950b 100644 --- a/drivers/gpu/drm/rvkms/output.rs +++ b/drivers/gpu/drm/rvkms/output.rs @@ -4,7 +4,7 @@ use crate::{ connector::Connector, encoder::Encoder, RvkmsDevice, - RvkmsDriver + Rvkms }; use kernel::{ drm::{ @@ -32,7 +32,7 @@ pub(crate) struct Output<'a> { encoder: &'a Encoder, } -pub(crate) fn create_output(dev: &PendingDevice<RvkmsDriver>, index: u8) -> Result { +pub(crate) fn create_output(dev: &PendingDevice<Rvkms>, index: u8) -> Result { let possible_crtcs = 1 << index; let primary = Plane::new( @@ -69,7 +69,7 @@ pub(crate) fn create_output(dev: &PendingDevice<RvkmsDriver>, index: u8) -> Resu /* impl<'a, 'b: 'a> Output<'b> { - pub(crate) fn new(dev: &'a PendingDevice<RvkmsDriver>, index: u8) -> Result<Self> { + pub(crate) fn new(dev: &'a PendingDevice<Rvkms>, index: u8) -> Result<Self> { let primary = Plane::new( dev, 1 << index, @@ -116,7 +116,7 @@ impl<'a, 'b: 'a> Output<'b> { #[derive(Clone)] pub(crate) struct FrameInfo { - pub(crate) fb: ARef<Framebuffer<RvkmsDriver>>, + pub(crate) fb: ARef<Framebuffer<Rvkms>>, pub(crate) src: Rect, pub(crate) dst: Rect, pub(crate) rotated: Rect, diff --git a/drivers/gpu/drm/rvkms/plane.rs b/drivers/gpu/drm/rvkms/plane.rs index de85e2b404e7ca2e3e12cbee890f666d4fb90f42..dc1d63d4c93d757ecfcb1211b322d2876ccce111 100644 --- a/drivers/gpu/drm/rvkms/plane.rs +++ b/drivers/gpu/drm/rvkms/plane.rs @@ -1,12 +1,11 @@ use core::marker::PhantomPinned; use super::{ - RvkmsDriver, + Rvkms, crtc::DriverCrtc, output::FrameInfo, }; use kernel::{ prelude::*, - device::RawDevice, drm::{ device::Device, kms::{ @@ -31,15 +30,13 @@ pub(crate) type PlaneState = ShadowPlaneState<RvkmsPlaneState>; #[vtable] impl plane::DriverPlane for DriverPlane { - type Initializer = impl PinInit<Self, Error>; - type State = PlaneState; - type Driver = RvkmsDriver; + type Driver = Rvkms; type Args = (); - fn new(device: &Device<Self::Driver>, args: Self::Args) -> Self::Initializer { + fn new(device: &Device<Self::Driver>, args: Self::Args) -> impl PinInit<Self, Error> { try_pin_init!(Self { _p: PhantomPinned }) } diff --git a/drivers/gpu/drm/rvkms/rvkms.rs b/drivers/gpu/drm/rvkms/rvkms.rs index f66a6a86d71e2dbbb296a2de9f5b8736975a4e9a..85b353af0c150a3fdc30fbf2b3a8e0959d287cd9 100644 --- a/drivers/gpu/drm/rvkms/rvkms.rs +++ b/drivers/gpu/drm/rvkms/rvkms.rs @@ -36,21 +36,19 @@ use kernel::{ prelude::*, sync::{Arc, Mutex}, types::ARef, - new_mutex + new_mutex, + module_platform_driver }; use crate::output::Output; -pub(crate) struct RvkmsDriver; pub(crate) struct Resources; -pub(crate) type DeviceData = device::Data<Arc<Data>>; - /// Convienence type alias for the DRM device type for this driver -pub(crate) type RvkmsDevice = drm::device::Device<RvkmsDriver>; +pub(crate) type RvkmsDevice = drm::device::Device<Rvkms>; /// The name of the driver -const NAME: CStr = c_str!("rvkms"); +const NAME: &'static CStr = c_str!("rvkms"); /// Driver metadata const INFO: drv::DriverInfo = drv::DriverInfo { @@ -72,12 +70,11 @@ const MAX_RES: (i32, i32) = (8192, 8192); const DEFAULT_RES: (i32, i32) = (1024, 768); pub(crate) struct Data { - drm: ARef<RvkmsDevice>, } /// DRM Driver implementation for `RvkmsDriver` #[vtable] -impl drv::Driver for RvkmsDriver { +impl drv::Driver for Rvkms { type Data = Arc<Data>; type Object = gem::Object; type File = file::File; @@ -86,41 +83,43 @@ impl drv::Driver for RvkmsDriver { const FEATURES:u32 = drv::FEAT_GEM | drv::FEAT_MODESET | drv::FEAT_ATOMIC; kernel::declare_drm_ioctls! {} + + fn pre_registration(drm: &drm::device::PendingDevice<Self>) -> Result { + drm.setup_kms(&MODE_CONFIG_INFO)?; + + output::create_output(drm, 0)?; + + drm.mode_config_reset(); + + Ok(()) + } } -impl KmsDriver for RvkmsDriver {} +impl KmsDriver for Rvkms {} -impl platform::Driver for RvkmsDriver { +impl platform::Driver for Rvkms { type Data = Arc<Data>; type IdInfo = (); fn probe(pdev: &mut platform::Device, id_info: Option<&Self::IdInfo>) -> Result<Self::Data> { // XXX: do not fret, the mutable reference here is temporary (poke dakr if it isn't) let dev: &device::Device = pdev.as_ref(); - dev.pr_info(format_args!("RVKMS probing")); - - let drm = drm::device::PendingDevice::new(dev)?; - - drm.setup_kms(&MODE_CONFIG_INFO)?; - - output::create_output(drm, 0)?; - - drm.mode_config_reset()?; + dev.pr_info(format_args!("RVKMS probing\n")); dev.dma_coerce_mask_and_coherent(kernel::dma::dma_bit_mask(64))?; - let data = Arc::new(Data { drm: ARef::from(&drm) }, GFP_KERNEL)?; - let drm = drv::Registration::new_foreign_owned(drm, data.clone(), 0)?; - - drm.fbdev_generic_setup(); + let data = Arc::new(Data { }, GFP_KERNEL)?; + let drm = drv::Registration::<Rvkms>::new_foreign_owned(dev, data.clone(), 0)?; Ok(data) } } pub(crate) struct Rvkms { - drm: ARef<RvkmsDevice>, - //_resource: device::Resource, + //drm: ARef<RvkmsDevice>, + // TODO: Figure out if we still need this + _resource: device::Resource, + drv_reg: Pin<Box<platform::Registration<Self>>>, pdev: platform::Device, } @@ -131,9 +130,21 @@ const MODE_CONFIG_INFO: ModeConfigInfo = ModeConfigInfo { preferred_depth: 0, }; -impl<'a> kernel::Module for Rvkms<'a> { - fn init(name: &'static str::CStr, module: &'static ThisModule) -> kernel::error::Result<Self> { - todo!() +impl kernel::Module for Rvkms { + fn init(name: &'static CStr, module: &'static ThisModule) -> kernel::error::Result<Self> { + pr_info!("RVKMS module loaded\n"); + + // Register the driver + let drv_reg = Box::try_pin_init(platform::Registration::new(name, module), GFP_KERNEL)?; + + let pdev = platform::Device::create_simple(&NAME, 0)?; + let dev: &device::Device = pdev.as_ref(); + + Ok(Self { + drv_reg, + _resource: dev.open_group()?, + pdev, + }) } // TODO: Redo this whole init function, we should merely register the driver here and create the diff --git a/rust/kernel/device.rs b/rust/kernel/device.rs index bb210c957d8434348c174fc1d1f99b2a1d2bc764..8b873daac17c810cc7a418afca1d4f7dc8102fc0 100644 --- a/rust/kernel/device.rs +++ b/rust/kernel/device.rs @@ -10,7 +10,10 @@ use crate::{ prelude::*, types::{ARef, Opaque}, }; -use core::{fmt, ptr}; +use core::{ + fmt, + ptr::{self, NonNull, null_mut} +}; #[cfg(CONFIG_PRINTK)] use crate::c_str; @@ -256,22 +259,19 @@ impl Device { unsafe { bindings::dma_unmap_sg_attrs(dev, &mut sglist[0], count, dir, 0) }; } - /// Open a new devres group for dev with id. - pub fn open_group(&self, id: *mut core::ffi::c_void) -> Result<Resource> { + /// Open a new devres group for the given device + pub fn open_group(&self) -> Result<Resource> { // SAFETY: The requirements are satisfied by the existence of `Device` and its safety // requirements. let id = unsafe { // Keep the allocation flags as GFP_KERNEL, as currently all users // are using this flag. - bindings::devres_open_group(self.as_raw(), id, bindings::GFP_KERNEL) + bindings::devres_open_group(self.as_raw(), null_mut(), bindings::GFP_KERNEL) }; - if id.is_null() { - return Err(ENOMEM); - } Ok(Resource { - dev: self.as_raw(), - id, + dev: self.into(), + id: NonNull::new(id).ok_or(ENOMEM)?, }) } } @@ -296,17 +296,19 @@ unsafe impl Send for Device {} // synchronization in `struct device`. unsafe impl Sync for Device {} -/// Device Resource Management +/// A devres resource group +/// +/// It will be destroyed once dropped pub struct Resource { - dev: *mut bindings::device, - id: *mut core::ffi::c_void, + dev: NonNull<Device>, + id: NonNull<core::ffi::c_void>, } impl Drop for Resource { /// Release resources in a devres group fn drop(&mut self) { // SAFETY: The resource was properly allocated by the Device - unsafe { bindings::devres_release_group(self.dev, self.id) }; + unsafe { bindings::devres_release_group(self.dev.as_ref().as_raw(), self.id.as_ptr()) }; } } diff --git a/rust/kernel/drm/device.rs b/rust/kernel/drm/device.rs index 09cf4240f938feb5c0d93ec487db3e218f547b8a..1c086cedd53954d84a84ed0adfd442f1c8e72342 100644 --- a/rust/kernel/drm/device.rs +++ b/rust/kernel/drm/device.rs @@ -207,9 +207,3 @@ impl<T: drm::drv::Driver> Deref for PendingDevice<T> { &self.0 } } - -impl<T: drm::drv::Driver> PendingDevice<T> { - pub fn new(dev: impl AsRef<device::Device>) -> Result<Self> { - Ok(Self(Device::new(dev.as_ref())?)) - } -} diff --git a/rust/kernel/drm/drv.rs b/rust/kernel/drm/drv.rs index 7d685a8551e4bddfdebe51a185172848892a8657..25651ffe16f2045f1395656c76bb1b44ab0b02c8 100644 --- a/rust/kernel/drm/drv.rs +++ b/rust/kernel/drm/drv.rs @@ -9,6 +9,7 @@ use crate::{ bindings, devres::Devres, drm, + device, error::{Error, Result}, private::Sealed, str::CStr, @@ -115,7 +116,7 @@ pub trait AllocImpl: Sealed + drm::gem::IntoGEMObject { /// A DRM driver implementation. #[vtable] -pub trait Driver { +pub trait Driver: Sized { /// Context data associated with the DRM driver /// /// Determines the type of the context data passed to each of the methods of the trait. @@ -137,6 +138,11 @@ pub trait Driver { /// IOCTL list. See `kernel::drm::ioctl::declare_drm_ioctls!{}`. const IOCTLS: &'static [drm::ioctl::DrmIoctlDescriptor]; + + /// Optional trait for handling pre-registration device initialization + fn pre_registration(drm: &drm::device::PendingDevice<Self>) -> Result { + Ok(()) + } } /// A registration of a DRM device @@ -148,21 +154,39 @@ pub struct Registration<T: Driver>(ARef<drm::device::Device<T>>); impl<T: Driver> Registration<T> { /// Creates a new [`Registration`] and registers it. - pub fn new(drm: drm::device::PendingDevice<T>, flags: usize) -> Result<Self> { + pub fn new(dev: &device::Device, data: T::Data, flags: usize) -> Result<Self> { + let drm = drm::device::PendingDevice(drm::device::Device::<T>::new(dev, data)?); + + T::pre_registration(&drm)?; + // SAFETY: Safe by the invariants of `drm::device::Device`. let ret = unsafe { bindings::drm_dev_register(drm.as_raw(), flags as u64) }; if ret < 0 { return Err(Error::from_errno(ret)); } - Ok(Self(dev.0)) + // For KMS devices, don't forget to setup fbdev before handing the registration to the + // caller since this is common to all KMS devices + if drm.kms_initialized() { + // SAFETY: We just checked that KMS was initialized for this device, so this function is + // safe to call + unsafe { bindings::drm_fbdev_generic_setup( + drm.as_raw(), + (*drm.as_raw()).mode_config.preferred_depth) } + } + + Ok(Self(ARef::from(drm.0))) } /// Same as [`Registration::new`}, but transfers ownership of the [`Registration`] to `Devres`. - pub fn new_foreign_owned(drm: drm::device::PendingDevice<T>, flags: usize) -> Result { - let reg = Registration::<T>::new(drm.clone(), flags)?; - - Devres::new_foreign_owned(dev.as_ref(), reg, GFP_KERNEL).map(|_| dev.0) + pub fn new_foreign_owned( + dev: &device::Device, + data: T::Data, + flags: usize + ) -> Result { + let reg = Registration::<T>::new(dev, data, flags)?; + + Devres::new_foreign_owned(dev, reg, GFP_KERNEL) } /// Returns a reference to the `Device` instance for this registration. diff --git a/rust/kernel/drm/kms/connector.rs b/rust/kernel/drm/kms/connector.rs index c918dbbf1810f202626d40158e3c70f6e93d2140..e62514c020caa43f0e07059e374edbcb6c977530 100644 --- a/rust/kernel/drm/kms/connector.rs +++ b/rust/kernel/drm/kms/connector.rs @@ -63,10 +63,6 @@ pub use bindings::{ /// A DRM connector implementation pub trait DriverConnector: Send + Sync + Sized { - /// The return type of the new() function. Should be `impl PinInit<Self, Error>`. - /// TODO: Remove this when return_position_impl_trait_in_trait is stable. - type Initializer: PinInit<Self, Error>; - /// The data type to use for passing incoming arguments for new `Connector<T>` instances /// Drivers which don't care about this can just use `()` type Args; @@ -78,7 +74,7 @@ pub trait DriverConnector: Send + Sync + Sized { type State: DriverConnectorState; /// Create a new instance of the private driver data struct for this connector in-place - fn new(dev: &Device<Self::Driver>, args: Self::Args) -> Self::Initializer; + fn new(device: &Device<Self::Driver>, args: Self::Args) -> impl PinInit<Self, Error>; /// Retrieve a list of available display modes for this connector fn get_modes<'a>( diff --git a/rust/kernel/drm/kms/crtc.rs b/rust/kernel/drm/kms/crtc.rs index fad2b00b740cd02bafd677c1c7476ff10b504d1f..3ea8cda55554e688989b3a2fcab9a4cad4e76f76 100644 --- a/rust/kernel/drm/kms/crtc.rs +++ b/rust/kernel/drm/kms/crtc.rs @@ -32,10 +32,6 @@ use macros::vtable; /// KMS CRTC object functions, which must be implemented by drivers. #[vtable] pub trait DriverCrtc: Send + Sync + Sized { - /// The return type of the new() function. Should be `impl PinInit<Self, Error>`. - /// TODO: Remove this when return_position_impl_trait_in_trait is stable. - type Initializer: PinInit<Self, Error>; - /// The data type to use for passing incoming arguments for new `Crtc<T>` instances /// Drivers which don't care about this can just use `()` type Args; @@ -47,7 +43,7 @@ pub trait DriverCrtc: Send + Sync + Sized { type State: DriverCrtcState; /// Create a new CRTC for this driver - fn new(device: &Device<Self::Driver>, args: Self::Args) -> Self::Initializer; + fn new(device: &Device<Self::Driver>, args: Self::Args) -> impl PinInit<Self, Error>; fn atomic_check(crtc: &Crtc<Self>, state: &AtomicStateComposer<Self::Driver>) -> Result { build_error::build_error("This should not be reachable") diff --git a/rust/kernel/drm/kms/encoder.rs b/rust/kernel/drm/kms/encoder.rs index 4179cce4da90fb1aaea7dd45e56fada8f24dd9fc..8585c328e6ecf9cf047bfed0d85710b3f6132865 100644 --- a/rust/kernel/drm/kms/encoder.rs +++ b/rust/kernel/drm/kms/encoder.rs @@ -37,10 +37,6 @@ pub use bindings::{ /// The main trait for KMS drivers to implement for their display encoders. pub trait DriverEncoder: Send + Sync + Sized { - /// The return type of the new() function. Should be `impl PinInit<Self, Error>`. - /// TODO: Remove this when return_position_impl_trait_in_trait is stable. - type Initializer: PinInit<Self, Error>; - /// The parent driver for this drm_encoder implementation type Driver: KmsDriver; @@ -49,7 +45,7 @@ pub trait DriverEncoder: Send + Sync + Sized { type Args; /// Create a new encoder for this driver - fn new(device: &Device<Self::Driver>, args: Self::Args) -> Self::Initializer; + fn new(device: &Device<Self::Driver>, args: Self::Args) -> impl PinInit<Self, Error>; } /// A trait for objects which can be used as a DRM encoder. diff --git a/rust/kernel/drm/kms/plane.rs b/rust/kernel/drm/kms/plane.rs index 28a5fb6c84acba6715c764c9e79cb067ea4f88a2..52917e2923e8af49d8707a75d64ef6e484bd66ba 100644 --- a/rust/kernel/drm/kms/plane.rs +++ b/rust/kernel/drm/kms/plane.rs @@ -37,10 +37,6 @@ use super::{ /// whatever struct the driver defines which implements this trait. #[vtable] pub trait DriverPlane: Send + Sync + Sized { - /// The return type of the new() function. Should be `impl PinInit<Self, Error>`. - /// TODO: Remove this when return_position_impl_trait_in_trait is stable. - type Initializer: PinInit<Self, Error>; - /// The data type to use for passing incoming arguments for new `Plane<T>` instances /// Drivers which don't care about this can just use `()` type Args; @@ -54,7 +50,7 @@ pub trait DriverPlane: Send + Sync + Sized { type State: PlaneStateHelper; /// Create the plane driver's private data structure - fn new(device: &Device<Self::Driver>, args: Self::Args) -> Self::Initializer; + fn new(device: &Device<Self::Driver>, args: Self::Args) -> impl PinInit<Self, Error>; /// The atomic check hook fn atomic_check(plane: &Plane<Self>, state: &AtomicStateComposer<Self::Driver>) -> Result { diff --git a/rust/kernel/platform.rs b/rust/kernel/platform.rs index 86d662609ee457212e8f1b2395dff39acc7fc8ea..08fa9048067798bc8acf8a3557f3ede0765c0445 100644 --- a/rust/kernel/platform.rs +++ b/rust/kernel/platform.rs @@ -186,3 +186,37 @@ impl AsRef<device::Device> for Device { &self.dev } } + +/// XXX: Lyude: I literally just copy pasted this from asahi. do it properly with a commit TODO + +/// Declares a kernel module that exposes a single platform driver. +/// +/// # Examples +/// +/// ```ignore +/// # use kernel::{platform, define_of_id_table, module_platform_driver}; +/// # +/// struct MyDriver; +/// impl platform::Driver for MyDriver { +/// // [...] +/// # fn probe(_dev: &mut platform::Device, _id_info: Option<&Self::IdInfo>) -> Result { +/// # Ok(()) +/// # } +/// # define_of_id_table! {(), [ +/// # (of::DeviceId::Compatible(b"brcm,bcm2835-rng"), None), +/// # ]} +/// } +/// +/// module_platform_driver! { +/// type: MyDriver, +/// name: "module_name", +/// author: "Author name", +/// license: "GPL", +/// } +/// ``` +#[macro_export] +macro_rules! module_platform_driver { + ($($f:tt)*) => { + $crate::module_driver!(<T>, $crate::platform::Adapter<T>, { $($f)* }); + }; +}