On Tue Jun 2, 2026 at 2:12 AM BST, Deborah Brouwer wrote:
> On Mon, Jun 01, 2026 at 09:35:04AM +0000, Alice Ryhl wrote:
>> On Fri, May 29, 2026 at 02:00:54AM +0200, 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.
>> > 
>> > Reviewed-by: Eliot Courtney <[email protected]>
>> > Reviewed-by: Alexandre Courbot <[email protected]>
>> > Signed-off-by: Danilo Krummrich <[email protected]>
>> 
>> > -pub(crate) type IoMem = kernel::io::mem::IoMem<'static, SZ_2M>;
>> > +pub(crate) type IoMem<'a> = kernel::io::mem::IoMem<'a, SZ_2M>;
>> 
>> It'd make more sense for me to put 'b or 'bound here.
>> 
>> >          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);
>> 
>> 
>> While this change is fine, I notice that we don't actually keep the
>> iomem alive past the probe method. I assume we're going to need that,
>> which leads to the question of whether we can store the iomem in the
>> places we need it.
>> 
>> As far as I can tell, we can store it in TyrPlatformDriverData but not
>> in TyrDrmDeviceData, is that right?
>
> I'm still getting my head around how this applies to tyr's firmware
> series, but yes we stop storing iomem in TyrDrmDeviceData, but we won't
> store it in TyrPlatformDriverData.
> Instead there is a new struct "RegistrationData" that will store the iomem
> like this:
>
> #[vtable]
> impl drm::Driver for TyrDrmDriver {
>     type Data = TyrDrmDeviceData;
>     type RegistrationData = TyrDrmRegistrationData<'static>;
>

I am not sure what the distinction even mean for a class device?

There's 1 device per registration, so they're equal. Am I missing something?

Best,
Gary

> And then in probe something like:
>
>  let reg_data = try_pin_init!(TyrDrmRegistrationData {
>   pdev: platform.clone(),
>   fw: firmware,
>   clks <- new_mutex!(Clocks {
>     core: core_clk,
>     stacks: stacks_clk,
>     coregroup: coregroup_clk,
>   }),
>   regulators <- new_mutex!(Regulators {
>     _mali: mali_regulator,
>     _sram: sram_regulator,
>   }),
>   iomem,
>   gpu_info,
>  });
>
>  drm::driver::Registration::new_foreign_owned(ddev, pdev.as_ref(), reg_data, 
> 0)?;
>
>
>> 
>> I guess it does make sense because the io memory goes away if the
>> underlying platform device (the bus) goes away, even if the drm device
>> still exists due to open fds from userspace.
>> 
>> Alice


Reply via email to