* [PATCH 0/2] drm: tyr: use lifetime-bound IoMem @ 2026-05-25 23:01 Danilo Krummrich 2026-05-25 23:01 ` [PATCH 1/2] gpu: drm: tyr: separate driver type from driver data Danilo Krummrich 2026-05-25 23:01 ` [PATCH 2/2] gpu: drm: tyr: use IoMem directly instead of Devres Danilo Krummrich 0 siblings, 2 replies; 7+ messages in thread From: Danilo Krummrich @ 2026-05-25 23:01 UTC (permalink / raw) To: dakr, aliceryhl, daniel.almeida, boris.brezillon, deborah.brouwer, gary Cc: dri-devel, rust-for-linux Adopt the driver core lifetime infrastructure for tyr. Separate the driver type from the driver data and use lifetime-bound IoMem directly in probe instead of wrapping it in Devres and Arc, simplifying register access. This patch series is based on [1] and drm-rust-next. [1] https://lore.kernel.org/driver-core/20260525202921.124698-1-dakr@kernel.org/ Danilo Krummrich (2): gpu: drm: tyr: separate driver type from driver data gpu: drm: tyr: use IoMem directly instead of Devres drivers/gpu/drm/tyr/driver.rs | 29 ++++++++++++----------------- drivers/gpu/drm/tyr/gpu.rs | 13 +++---------- drivers/gpu/drm/tyr/tyr.rs | 4 ++-- 3 files changed, 17 insertions(+), 29 deletions(-) -- 2.54.0 ^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH 1/2] gpu: drm: tyr: separate driver type from driver data 2026-05-25 23:01 [PATCH 0/2] drm: tyr: use lifetime-bound IoMem Danilo Krummrich @ 2026-05-25 23:01 ` Danilo Krummrich 2026-05-26 1:17 ` Eliot Courtney 2026-05-26 6:43 ` Boris Brezillon 2026-05-25 23:01 ` [PATCH 2/2] gpu: drm: tyr: use IoMem directly instead of Devres Danilo Krummrich 1 sibling, 2 replies; 7+ messages in thread From: Danilo Krummrich @ 2026-05-25 23:01 UTC (permalink / raw) To: dakr, aliceryhl, daniel.almeida, boris.brezillon, deborah.brouwer, gary Cc: dri-devel, rust-for-linux Introduce TyrPlatformDriver as a unit struct for the platform::Driver trait implementation and keep TyrPlatformDriverData for the private driver data. Signed-off-by: Danilo Krummrich <dakr@kernel.org> --- drivers/gpu/drm/tyr/driver.rs | 10 ++++++---- drivers/gpu/drm/tyr/tyr.rs | 4 ++-- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/drivers/gpu/drm/tyr/driver.rs b/drivers/gpu/drm/tyr/driver.rs index 2224fdb20a51..5f4c484f671f 100644 --- a/drivers/gpu/drm/tyr/driver.rs +++ b/drivers/gpu/drm/tyr/driver.rs @@ -51,6 +51,8 @@ /// Convenience type alias for the DRM device type for this driver. pub(crate) type TyrDrmDevice = drm::Device<TyrDrmDriver>; +pub(crate) struct TyrPlatformDriver; + #[pin_data(PinnedDrop)] pub(crate) struct TyrPlatformDriverData { _device: ARef<TyrDrmDevice>, @@ -93,22 +95,22 @@ fn issue_soft_reset(dev: &Device<Bound>, iomem: &Devres<IoMem>) -> Result { kernel::of_device_table!( OF_TABLE, MODULE_OF_TABLE, - <TyrPlatformDriverData as platform::Driver>::IdInfo, + <TyrPlatformDriver as platform::Driver>::IdInfo, [ (of::DeviceId::new(c"rockchip,rk3588-mali"), ()), (of::DeviceId::new(c"arm,mali-valhall-csf"), ()) ] ); -impl platform::Driver for TyrPlatformDriverData { +impl platform::Driver for TyrPlatformDriver { type IdInfo = (); - type Data<'bound> = Self; + type Data<'bound> = TyrPlatformDriverData; const OF_ID_TABLE: Option<of::IdTable<Self::IdInfo>> = Some(&OF_TABLE); fn probe<'bound>( pdev: &'bound platform::Device<Core<'_>>, _info: Option<&'bound Self::IdInfo>, - ) -> impl PinInit<Self, Error> + 'bound { + ) -> impl PinInit<Self::Data<'bound>, Error> + 'bound { let core_clk = Clk::get(pdev.as_ref(), Some(c"core"))?; let stacks_clk = OptionalClk::get(pdev.as_ref(), Some(c"stacks"))?; let coregroup_clk = OptionalClk::get(pdev.as_ref(), Some(c"coregroup"))?; diff --git a/drivers/gpu/drm/tyr/tyr.rs b/drivers/gpu/drm/tyr/tyr.rs index 9432ddd6b5b8..95cda7b0962f 100644 --- a/drivers/gpu/drm/tyr/tyr.rs +++ b/drivers/gpu/drm/tyr/tyr.rs @@ -5,7 +5,7 @@ //! The name "Tyr" is inspired by Norse mythology, reflecting Arm's tradition of //! naming their GPUs after Nordic mythological figures and places. -use crate::driver::TyrPlatformDriverData; +use crate::driver::TyrPlatformDriver; mod driver; mod file; @@ -14,7 +14,7 @@ mod regs; kernel::module_platform_driver! { - type: TyrPlatformDriverData, + type: TyrPlatformDriver, name: "tyr", authors: ["The Tyr driver authors"], description: "Arm Mali Tyr DRM driver", -- 2.54.0 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH 1/2] gpu: drm: tyr: separate driver type from driver data 2026-05-25 23:01 ` [PATCH 1/2] gpu: drm: tyr: separate driver type from driver data Danilo Krummrich @ 2026-05-26 1:17 ` Eliot Courtney 2026-05-26 6:43 ` Boris Brezillon 1 sibling, 0 replies; 7+ messages in thread From: Eliot Courtney @ 2026-05-26 1:17 UTC (permalink / raw) To: Danilo Krummrich, aliceryhl, daniel.almeida, boris.brezillon, deborah.brouwer, gary Cc: dri-devel, rust-for-linux, dri-devel On Tue May 26, 2026 at 8:01 AM JST, Danilo Krummrich wrote: > Introduce TyrPlatformDriver as a unit struct for the platform::Driver > trait implementation and keep TyrPlatformDriverData for the private > driver data. > > Signed-off-by: Danilo Krummrich <dakr@kernel.org> > --- Reviewed-by: Eliot Courtney <ecourtney@nvidia.com> ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH 1/2] gpu: drm: tyr: separate driver type from driver data 2026-05-25 23:01 ` [PATCH 1/2] gpu: drm: tyr: separate driver type from driver data Danilo Krummrich 2026-05-26 1:17 ` Eliot Courtney @ 2026-05-26 6:43 ` Boris Brezillon 1 sibling, 0 replies; 7+ messages in thread From: Boris Brezillon @ 2026-05-26 6:43 UTC (permalink / raw) To: Danilo Krummrich Cc: aliceryhl, daniel.almeida, deborah.brouwer, gary, dri-devel, rust-for-linux On Tue, 26 May 2026 01:01:43 +0200 Danilo Krummrich <dakr@kernel.org> wrote: > Introduce TyrPlatformDriver as a unit struct for the platform::Driver > trait implementation and keep TyrPlatformDriverData for the private > driver data. > > Signed-off-by: Danilo Krummrich <dakr@kernel.org> Reviewed-by: Boris Brezillon <boris.brezillon@collabora.com> > --- > drivers/gpu/drm/tyr/driver.rs | 10 ++++++---- > drivers/gpu/drm/tyr/tyr.rs | 4 ++-- > 2 files changed, 8 insertions(+), 6 deletions(-) > > diff --git a/drivers/gpu/drm/tyr/driver.rs b/drivers/gpu/drm/tyr/driver.rs > index 2224fdb20a51..5f4c484f671f 100644 > --- a/drivers/gpu/drm/tyr/driver.rs > +++ b/drivers/gpu/drm/tyr/driver.rs > @@ -51,6 +51,8 @@ > /// Convenience type alias for the DRM device type for this driver. > pub(crate) type TyrDrmDevice = drm::Device<TyrDrmDriver>; > > +pub(crate) struct TyrPlatformDriver; > + > #[pin_data(PinnedDrop)] > pub(crate) struct TyrPlatformDriverData { > _device: ARef<TyrDrmDevice>, > @@ -93,22 +95,22 @@ fn issue_soft_reset(dev: &Device<Bound>, iomem: &Devres<IoMem>) -> Result { > kernel::of_device_table!( > OF_TABLE, > MODULE_OF_TABLE, > - <TyrPlatformDriverData as platform::Driver>::IdInfo, > + <TyrPlatformDriver as platform::Driver>::IdInfo, > [ > (of::DeviceId::new(c"rockchip,rk3588-mali"), ()), > (of::DeviceId::new(c"arm,mali-valhall-csf"), ()) > ] > ); > > -impl platform::Driver for TyrPlatformDriverData { > +impl platform::Driver for TyrPlatformDriver { > type IdInfo = (); > - type Data<'bound> = Self; > + type Data<'bound> = TyrPlatformDriverData; > const OF_ID_TABLE: Option<of::IdTable<Self::IdInfo>> = Some(&OF_TABLE); > > fn probe<'bound>( > pdev: &'bound platform::Device<Core<'_>>, > _info: Option<&'bound Self::IdInfo>, > - ) -> impl PinInit<Self, Error> + 'bound { > + ) -> impl PinInit<Self::Data<'bound>, Error> + 'bound { > let core_clk = Clk::get(pdev.as_ref(), Some(c"core"))?; > let stacks_clk = OptionalClk::get(pdev.as_ref(), Some(c"stacks"))?; > let coregroup_clk = OptionalClk::get(pdev.as_ref(), Some(c"coregroup"))?; > diff --git a/drivers/gpu/drm/tyr/tyr.rs b/drivers/gpu/drm/tyr/tyr.rs > index 9432ddd6b5b8..95cda7b0962f 100644 > --- a/drivers/gpu/drm/tyr/tyr.rs > +++ b/drivers/gpu/drm/tyr/tyr.rs > @@ -5,7 +5,7 @@ > //! The name "Tyr" is inspired by Norse mythology, reflecting Arm's tradition of > //! naming their GPUs after Nordic mythological figures and places. > > -use crate::driver::TyrPlatformDriverData; > +use crate::driver::TyrPlatformDriver; > > mod driver; > mod file; > @@ -14,7 +14,7 @@ > mod regs; > > kernel::module_platform_driver! { > - type: TyrPlatformDriverData, > + type: TyrPlatformDriver, > name: "tyr", > authors: ["The Tyr driver authors"], > description: "Arm Mali Tyr DRM driver", ^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH 2/2] gpu: drm: tyr: use IoMem directly instead of Devres 2026-05-25 23:01 [PATCH 0/2] drm: tyr: use lifetime-bound IoMem Danilo Krummrich 2026-05-25 23:01 ` [PATCH 1/2] gpu: drm: tyr: separate driver type from driver data Danilo Krummrich @ 2026-05-25 23:01 ` Danilo Krummrich 2026-05-26 1:30 ` Alexandre Courbot 2026-05-26 2:43 ` Eliot Courtney 1 sibling, 2 replies; 7+ messages in thread From: Danilo Krummrich @ 2026-05-25 23:01 UTC (permalink / raw) To: dakr, aliceryhl, daniel.almeida, boris.brezillon, deborah.brouwer, gary Cc: dri-devel, rust-for-linux Now that IoMem is lifetime-parameterized, use it directly in probe rather than wrapping it in Devres and Arc. The I/O memory mapping is only used during probe and not stored in driver data, so device-managed revocation is unnecessary. This removes the Devres access(dev) pattern from issue_soft_reset(), GpuInfo::new(), and l2_power_on(), simplifying register access. Signed-off-by: Danilo Krummrich <dakr@kernel.org> --- drivers/gpu/drm/tyr/driver.rs | 19 ++++++------------- drivers/gpu/drm/tyr/gpu.rs | 13 +++---------- 2 files changed, 9 insertions(+), 23 deletions(-) diff --git a/drivers/gpu/drm/tyr/driver.rs b/drivers/gpu/drm/tyr/driver.rs index 5f4c484f671f..b9a5cc5fc678 100644 --- a/drivers/gpu/drm/tyr/driver.rs +++ b/drivers/gpu/drm/tyr/driver.rs @@ -6,11 +6,9 @@ OptionalClk, // }, device::{ - Bound, Core, Device, // }, - devres::Devres, dma::{ Device as DmaDevice, DmaMask, // @@ -30,7 +28,6 @@ sizes::SZ_2M, sync::{ aref::ARef, - Arc, Mutex, // }, time, // @@ -44,7 +41,7 @@ regs::gpu_control::*, // }; -pub(crate) type IoMem = kernel::io::mem::IoMem<'static, SZ_2M>; +pub(crate) type IoMem<'a> = kernel::io::mem::IoMem<'a, SZ_2M>; pub(crate) struct TyrDrmDriver; @@ -74,15 +71,11 @@ pub(crate) struct TyrDrmDeviceData { pub(crate) gpu_info: GpuInfo, } -fn issue_soft_reset(dev: &Device<Bound>, iomem: &Devres<IoMem>) -> Result { - let io = (*iomem).access(dev)?; - io.write_reg(GPU_COMMAND::reset(ResetMode::SoftReset)); +fn issue_soft_reset(dev: &Device, iomem: &IoMem<'_>) -> Result { + iomem.write_reg(GPU_COMMAND::reset(ResetMode::SoftReset)); poll::read_poll_timeout( - || { - let io = (*iomem).access(dev)?; - Ok(io.read(GPU_IRQ_RAWSTAT)) - }, + || Ok(iomem.read(GPU_IRQ_RAWSTAT)), |status| status.reset_completed(), time::Delta::from_millis(1), time::Delta::from_millis(100), @@ -123,12 +116,12 @@ fn probe<'bound>( let sram_regulator = Regulator::<regulator::Enabled>::get(pdev.as_ref(), c"sram")?; let request = pdev.io_request_by_index(0).ok_or(ENODEV)?; - let iomem = Arc::new(request.iomap_sized::<SZ_2M>()?.into_devres()?, GFP_KERNEL)?; + let iomem = request.iomap_sized::<SZ_2M>()?; issue_soft_reset(pdev.as_ref(), &iomem)?; gpu::l2_power_on(pdev.as_ref(), &iomem)?; - let gpu_info = GpuInfo::new(pdev.as_ref(), &iomem)?; + let gpu_info = GpuInfo::new(&iomem)?; gpu_info.log(pdev.as_ref()); let pa_bits = MMU_FEATURES::from_raw(gpu_info.mmu_features) diff --git a/drivers/gpu/drm/tyr/gpu.rs b/drivers/gpu/drm/tyr/gpu.rs index 652556026f50..3acffefaf210 100644 --- a/drivers/gpu/drm/tyr/gpu.rs +++ b/drivers/gpu/drm/tyr/gpu.rs @@ -9,7 +9,6 @@ Bound, Device, // }, - devres::Devres, io::{ poll, register::Array, @@ -40,9 +39,7 @@ pub(crate) struct GpuInfo(pub(crate) uapi::drm_panthor_gpu_info); impl GpuInfo { - pub(crate) fn new(dev: &Device<Bound>, iomem: &Devres<IoMem>) -> Result<Self> { - let io = (*iomem).access(dev)?; - + pub(crate) fn new(io: &IoMem<'_>) -> Result<Self> { Ok(Self(uapi::drm_panthor_gpu_info { gpu_id: io.read(GPU_ID).into_raw(), gpu_rev: io.read(REVIDR).into_raw(), @@ -163,15 +160,11 @@ struct GpuModels { }]; /// Powers on the l2 block. -pub(crate) fn l2_power_on(dev: &Device<Bound>, iomem: &Devres<IoMem>) -> Result { - let io = (*iomem).access(dev)?; +pub(crate) fn l2_power_on(dev: &Device, io: &IoMem<'_>) -> Result { io.write_reg(L2_PWRON_LO::zeroed().with_const_request::<1>()); poll::read_poll_timeout( - || { - let io = (*iomem).access(dev)?; - Ok(io.read(L2_READY_LO)) - }, + || Ok(io.read(L2_READY_LO)), |status| status.ready() == 1, Delta::from_millis(1), Delta::from_millis(100), -- 2.54.0 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH 2/2] gpu: drm: tyr: use IoMem directly instead of Devres 2026-05-25 23:01 ` [PATCH 2/2] gpu: drm: tyr: use IoMem directly instead of Devres Danilo Krummrich @ 2026-05-26 1:30 ` Alexandre Courbot 2026-05-26 2:43 ` Eliot Courtney 1 sibling, 0 replies; 7+ messages in thread From: Alexandre Courbot @ 2026-05-26 1:30 UTC (permalink / raw) To: Danilo Krummrich Cc: aliceryhl, daniel.almeida, boris.brezillon, deborah.brouwer, gary, dri-devel, rust-for-linux On Tue May 26, 2026 at 8:01 AM JST, Danilo Krummrich wrote: > Now that IoMem is lifetime-parameterized, use it directly in probe > rather than wrapping it in Devres and Arc. The I/O memory mapping is > only used during probe and not stored in driver data, so device-managed > revocation is unnecessary. > > This removes the Devres access(dev) pattern from issue_soft_reset(), > GpuInfo::new(), and l2_power_on(), simplifying register access. > > Signed-off-by: Danilo Krummrich <dakr@kernel.org> > --- > drivers/gpu/drm/tyr/driver.rs | 19 ++++++------------- > drivers/gpu/drm/tyr/gpu.rs | 13 +++---------- > 2 files changed, 9 insertions(+), 23 deletions(-) Reviewed-by: Alexandre Courbot <acourbot@nvidia.com> ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH 2/2] gpu: drm: tyr: use IoMem directly instead of Devres 2026-05-25 23:01 ` [PATCH 2/2] gpu: drm: tyr: use IoMem directly instead of Devres Danilo Krummrich 2026-05-26 1:30 ` Alexandre Courbot @ 2026-05-26 2:43 ` Eliot Courtney 1 sibling, 0 replies; 7+ messages in thread From: Eliot Courtney @ 2026-05-26 2:43 UTC (permalink / raw) To: Danilo Krummrich, aliceryhl, daniel.almeida, boris.brezillon, deborah.brouwer, gary Cc: dri-devel, rust-for-linux, dri-devel On Tue May 26, 2026 at 8:01 AM JST, Danilo Krummrich wrote: > Now that IoMem is lifetime-parameterized, use it directly in probe > rather than wrapping it in Devres and Arc. The I/O memory mapping is > only used during probe and not stored in driver data, so device-managed > revocation is unnecessary. > > This removes the Devres access(dev) pattern from issue_soft_reset(), > GpuInfo::new(), and l2_power_on(), simplifying register access. > > Signed-off-by: Danilo Krummrich <dakr@kernel.org> > --- > drivers/gpu/drm/tyr/driver.rs | 19 ++++++------------- > drivers/gpu/drm/tyr/gpu.rs | 13 +++---------- > 2 files changed, 9 insertions(+), 23 deletions(-) > > diff --git a/drivers/gpu/drm/tyr/driver.rs b/drivers/gpu/drm/tyr/driver.rs > index 5f4c484f671f..b9a5cc5fc678 100644 > --- a/drivers/gpu/drm/tyr/driver.rs > +++ b/drivers/gpu/drm/tyr/driver.rs > @@ -6,11 +6,9 @@ > OptionalClk, // > }, > device::{ > - Bound, > Core, > Device, // > }, > - devres::Devres, > dma::{ > Device as DmaDevice, > DmaMask, // > @@ -30,7 +28,6 @@ > sizes::SZ_2M, > sync::{ > aref::ARef, > - Arc, > Mutex, // > }, > time, // > @@ -44,7 +41,7 @@ > regs::gpu_control::*, // > }; > > -pub(crate) type IoMem = kernel::io::mem::IoMem<'static, SZ_2M>; > +pub(crate) type IoMem<'a> = kernel::io::mem::IoMem<'a, SZ_2M>; > > pub(crate) struct TyrDrmDriver; > > @@ -74,15 +71,11 @@ pub(crate) struct TyrDrmDeviceData { > pub(crate) gpu_info: GpuInfo, > } > > -fn issue_soft_reset(dev: &Device<Bound>, iomem: &Devres<IoMem>) -> Result { > - let io = (*iomem).access(dev)?; > - io.write_reg(GPU_COMMAND::reset(ResetMode::SoftReset)); > +fn issue_soft_reset(dev: &Device, iomem: &IoMem<'_>) -> Result { > + iomem.write_reg(GPU_COMMAND::reset(ResetMode::SoftReset)); > > poll::read_poll_timeout( > - || { > - let io = (*iomem).access(dev)?; > - Ok(io.read(GPU_IRQ_RAWSTAT)) > - }, > + || Ok(iomem.read(GPU_IRQ_RAWSTAT)), > |status| status.reset_completed(), > time::Delta::from_millis(1), > time::Delta::from_millis(100), > @@ -123,12 +116,12 @@ fn probe<'bound>( > let sram_regulator = Regulator::<regulator::Enabled>::get(pdev.as_ref(), c"sram")?; > > let request = pdev.io_request_by_index(0).ok_or(ENODEV)?; > - let iomem = Arc::new(request.iomap_sized::<SZ_2M>()?.into_devres()?, GFP_KERNEL)?; > + let iomem = request.iomap_sized::<SZ_2M>()?; > > issue_soft_reset(pdev.as_ref(), &iomem)?; > gpu::l2_power_on(pdev.as_ref(), &iomem)?; > > - let gpu_info = GpuInfo::new(pdev.as_ref(), &iomem)?; > + let gpu_info = GpuInfo::new(&iomem)?; > gpu_info.log(pdev.as_ref()); > > let pa_bits = MMU_FEATURES::from_raw(gpu_info.mmu_features) > diff --git a/drivers/gpu/drm/tyr/gpu.rs b/drivers/gpu/drm/tyr/gpu.rs > index 652556026f50..3acffefaf210 100644 > --- a/drivers/gpu/drm/tyr/gpu.rs > +++ b/drivers/gpu/drm/tyr/gpu.rs > @@ -9,7 +9,6 @@ > Bound, > Device, // > }, > - devres::Devres, > io::{ > poll, > register::Array, > @@ -40,9 +39,7 @@ > pub(crate) struct GpuInfo(pub(crate) uapi::drm_panthor_gpu_info); > > impl GpuInfo { > - pub(crate) fn new(dev: &Device<Bound>, iomem: &Devres<IoMem>) -> Result<Self> { > - let io = (*iomem).access(dev)?; > - > + pub(crate) fn new(io: &IoMem<'_>) -> Result<Self> { Perhaps a future patch can remove this now unnecessary looking Result in the return type. Reviewed-by: Eliot Courtney <ecourtney@nvidia.com> ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2026-05-26 6:44 UTC | newest] Thread overview: 7+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2026-05-25 23:01 [PATCH 0/2] drm: tyr: use lifetime-bound IoMem Danilo Krummrich 2026-05-25 23:01 ` [PATCH 1/2] gpu: drm: tyr: separate driver type from driver data Danilo Krummrich 2026-05-26 1:17 ` Eliot Courtney 2026-05-26 6:43 ` Boris Brezillon 2026-05-25 23:01 ` [PATCH 2/2] gpu: drm: tyr: use IoMem directly instead of Devres Danilo Krummrich 2026-05-26 1:30 ` Alexandre Courbot 2026-05-26 2:43 ` Eliot Courtney
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox