Linux Tegra architecture development
 help / color / mirror / Atom feed
* Fixing TegraDRM on multi_v7_defconfig / Enabling DMA API with tegra-smmu
@ 2026-07-24  7:35 Mikko Perttunen
  2026-07-27 14:51 ` Robin Murphy
  0 siblings, 1 reply; 3+ messages in thread
From: Mikko Perttunen @ 2026-07-24  7:35 UTC (permalink / raw)
  To: Robin Murphy, Jason Gunthorpe
  Cc: Linux ARM, linux-tegra, iommu@lists.linux.dev

Greetings everyone.

I've been looking at enabling more CI for 32-bit Tegra platforms 
recently, and I ran into a problem with TegraDRM not probing on 
tegra30-cardhu, but only on multi_v7_defconfig.

I traced the issue to the following sequence of events:

1. On multi_v7_defconfig, CONFIG_ARM_DMA_USE_IOMMU is enabled, while on 
   tegra_defconfig it is not. This causes arm_setup_iommu_dma_ops to run 
   on TegraDRM devices.

2. Some of these devices will be placed in a single IOMMU group by the 
   tegra-smmu driver. When arm_setup_iommu_dma_ops is called, depending 
   on probe deferrals, the group may have only the currently probing 
   device, or a previously deferred device and the new device.

   arm_setup_iommu_dma_ops calls iommu_attach_device. If the device is 
   alone in its group, this succeeds. If not, this fails. If 
   iommu_attach_device fails for every device in the group, everything 
   is "fine" and TegraDRM goes to probe and work fine. Hence let's 
   assume we have one device that succeeded the attach.

3. iommu_device_use_default_domain gets called and succeeds on the first 
   device in the group. On the second device in the group, it fails 
   since group->owner_cnt was already 1. The custom ARM DMA IOMMU 
   implementation uses a custom UNMANAGED domain so the domain != 
   default_domain check evaluates to true.

4. Devices fail to probe which leads TegraDRM overall not to probe.

I've thought of the following options to fix this:

1. Match behavior with tegra_defconfig: Figure out a way to not run 
   arm_setup_iommu_dma_ops for this situation (ideally any multi-device 
   group situation). However, I'd also like to enable DMA API with 
   tegra-smmu to get rid of the manual IOMMU API code paths in TegraDRM, 
   so this is not a particularly satisfying route.

2. Improve the legacy path: Fix the ARM IOMMU DMA code to support 
   groups, and add an exception in iommu_device_use_default_domain. But 
   I presume we don't want such non-trivial modifications to that code 
   at this point.

3. Modernize: Support CONFIG_IOMMU_DMA on ARM -- since there is an issue 
   with per-SoC quirks, I think this should be done one SoC at a time. 
   So come up with a way to dynamically pick between the legacy and 
   IOMMU_DMA paths. Perhaps if the SMMU driver explicitly requests the 
   DMA domain type, use the modern path. Currently, CONFIG_IOMMU_DMA and 
   CONFIG_ARM_DMA_USE_IOMMU are mutually exclusive so that has to be 
   changed.

FWIW, if we are to move to using DMA API with TegraDRM, one blocker 
would have to be resolved: boot splashes scanning out while the DMA 
domain is being set up. Since we cannot really use the iommu-addresses 
reserved-region device tree bindings with these old devices, my thought 
is to leave the display memory clients in bypass in tegra-smmu until the 
display driver has quiesced the hardware and can then call into 
tegra-smmu to enable translation.

Please let me know what you think and whom I missed in the To/Cc fields.

Thank you
Mikko




^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: Fixing TegraDRM on multi_v7_defconfig / Enabling DMA API with tegra-smmu
  2026-07-24  7:35 Fixing TegraDRM on multi_v7_defconfig / Enabling DMA API with tegra-smmu Mikko Perttunen
@ 2026-07-27 14:51 ` Robin Murphy
  2026-07-28 10:11   ` Mikko Perttunen
  0 siblings, 1 reply; 3+ messages in thread
From: Robin Murphy @ 2026-07-27 14:51 UTC (permalink / raw)
  To: Mikko Perttunen, Jason Gunthorpe
  Cc: Linux ARM, linux-tegra, iommu@lists.linux.dev

On 24/07/2026 8:35 am, Mikko Perttunen wrote:
> Greetings everyone.
> 
> I've been looking at enabling more CI for 32-bit Tegra platforms
> recently, and I ran into a problem with TegraDRM not probing on
> tegra30-cardhu, but only on multi_v7_defconfig.
> 
> I traced the issue to the following sequence of events:
> 
> 1. On multi_v7_defconfig, CONFIG_ARM_DMA_USE_IOMMU is enabled, while on
>     tegra_defconfig it is not. This causes arm_setup_iommu_dma_ops to run
>     on TegraDRM devices.
> 
> 2. Some of these devices will be placed in a single IOMMU group by the
>     tegra-smmu driver. When arm_setup_iommu_dma_ops is called, depending
>     on probe deferrals, the group may have only the currently probing
>     device, or a previously deferred device and the new device.
> 
>     arm_setup_iommu_dma_ops calls iommu_attach_device. If the device is
>     alone in its group, this succeeds. If not, this fails. If
>     iommu_attach_device fails for every device in the group, everything
>     is "fine" and TegraDRM goes to probe and work fine. Hence let's
>     assume we have one device that succeeded the attach.
> 
> 3. iommu_device_use_default_domain gets called and succeeds on the first
>     device in the group. On the second device in the group, it fails
>     since group->owner_cnt was already 1. The custom ARM DMA IOMMU
>     implementation uses a custom UNMANAGED domain so the domain !=
>     default_domain check evaluates to true.
> 
> 4. Devices fail to probe which leads TegraDRM overall not to probe.
> 
> I've thought of the following options to fix this:
> 
> 1. Match behavior with tegra_defconfig: Figure out a way to not run
>     arm_setup_iommu_dma_ops for this situation (ideally any multi-device
>     group situation). However, I'd also like to enable DMA API with
>     tegra-smmu to get rid of the manual IOMMU API code paths in TegraDRM,
>     so this is not a particularly satisfying route.
> 
> 2. Improve the legacy path: Fix the ARM IOMMU DMA code to support
>     groups, and add an exception in iommu_device_use_default_domain. But
>     I presume we don't want such non-trivial modifications to that code
>     at this point.
> 
> 3. Modernize: Support CONFIG_IOMMU_DMA on ARM -- since there is an issue
>     with per-SoC quirks, I think this should be done one SoC at a time.
>     So come up with a way to dynamically pick between the legacy and
>     IOMMU_DMA paths. Perhaps if the SMMU driver explicitly requests the
>     DMA domain type, use the modern path. Currently, CONFIG_IOMMU_DMA and
>     CONFIG_ARM_DMA_USE_IOMMU are mutually exclusive so that has to be
>     changed.
> 
> FWIW, if we are to move to using DMA API with TegraDRM, one blocker
> would have to be resolved: boot splashes scanning out while the DMA
> domain is being set up. Since we cannot really use the iommu-addresses
> reserved-region device tree bindings with these old devices, my thought
> is to leave the display memory clients in bypass in tegra-smmu until the
> display driver has quiesced the hardware and can then call into
> tegra-smmu to enable translation.
> 
> Please let me know what you think and whom I missed in the To/Cc fields.

TBH I rather feel like the time for converting ARM to iommu-dma has 
passed - there are drivers which rely on specific behaviours of the ARM 
IOVA allocator which iommu-dma does not match, and meanwhile iommu-dma 
continues to grow more server-specific features which would be nothing 
but bloat on ARMv7 systems with <=2GB of RAM and no virtualisation. At 
this point I'm inclined to treat the existing DMA ops as legacy code 
like with alpha/sparc/etc.

While there is technically an option 4, to have tegra-smmu do what 
ipmmu-vmsa and mtk_iommu_v1 do and go coercing the ARM dma_iommu_mapping 
into groups behind the arch code's back, I am also still hoping to get 
rid of that and the messy probe_finalize step altogether. FWIW my 
preference would be some form of option 2 - off-hand I imagine you could 
probably get most of the way there by propagating the ARM mapping 
through group->iommudata (ironically tegra-smmu being the only driver in 
the way of that - looks like it could probably do its internal group 
accounting explicitly in release_device instead), plus one or two 
special cases to recognise ARM DMA domains in the core code as you say. 
The more involved, but ultimately neater, option would be to turn the 
ARM mapping inside-out and make it a proper domain cookie type with the 
ARM code providing its own definitions of iommu_{get,put}_dma_cookie() 
and iommu_setup_dma_ops(), so it could then work as a proper 
IOMMU_DOMAIN_DMA default domain, and we can lose the current 
ARM-specific identity domain bodges as well. I reckon the impact of that 
to core code shouldn't be much worse than the existing special-cases it 
would replace, while on the arch side it should effectively only really 
redistribute the current arm_setup_iommu_dma_ops() path, so functionally 
pretty low risk as well. It's just liable to be fiddly to do in 
manageable steps rather than one giant patch changing everything at once...

Cheers,
Robin.

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: Fixing TegraDRM on multi_v7_defconfig / Enabling DMA API with tegra-smmu
  2026-07-27 14:51 ` Robin Murphy
@ 2026-07-28 10:11   ` Mikko Perttunen
  0 siblings, 0 replies; 3+ messages in thread
From: Mikko Perttunen @ 2026-07-28 10:11 UTC (permalink / raw)
  To: Jason Gunthorpe, Robin Murphy
  Cc: Linux ARM, linux-tegra, iommu@lists.linux.dev

On Monday, July 27, 2026 11:51 PM Robin Murphy wrote:
> On 24/07/2026 8:35 am, Mikko Perttunen wrote:
> > Greetings everyone.
> > 
> > I've been looking at enabling more CI for 32-bit Tegra platforms
> > recently, and I ran into a problem with TegraDRM not probing on
> > tegra30-cardhu, but only on multi_v7_defconfig.
> > 
> > I traced the issue to the following sequence of events:
> > 
> > 1. On multi_v7_defconfig, CONFIG_ARM_DMA_USE_IOMMU is enabled, while on
> >     tegra_defconfig it is not. This causes arm_setup_iommu_dma_ops to run
> >     on TegraDRM devices.
> > 
> > 2. Some of these devices will be placed in a single IOMMU group by the
> >     tegra-smmu driver. When arm_setup_iommu_dma_ops is called, depending
> >     on probe deferrals, the group may have only the currently probing
> >     device, or a previously deferred device and the new device.
> > 
> >     arm_setup_iommu_dma_ops calls iommu_attach_device. If the device is
> >     alone in its group, this succeeds. If not, this fails. If
> >     iommu_attach_device fails for every device in the group, everything
> >     is "fine" and TegraDRM goes to probe and work fine. Hence let's
> >     assume we have one device that succeeded the attach.
> > 
> > 3. iommu_device_use_default_domain gets called and succeeds on the first
> >     device in the group. On the second device in the group, it fails
> >     since group->owner_cnt was already 1. The custom ARM DMA IOMMU
> >     implementation uses a custom UNMANAGED domain so the domain !=
> >     default_domain check evaluates to true.
> > 
> > 4. Devices fail to probe which leads TegraDRM overall not to probe.
> > 
> > I've thought of the following options to fix this:
> > 
> > 1. Match behavior with tegra_defconfig: Figure out a way to not run
> >     arm_setup_iommu_dma_ops for this situation (ideally any multi-device
> >     group situation). However, I'd also like to enable DMA API with
> >     tegra-smmu to get rid of the manual IOMMU API code paths in TegraDRM,
> >     so this is not a particularly satisfying route.
> > 
> > 2. Improve the legacy path: Fix the ARM IOMMU DMA code to support
> >     groups, and add an exception in iommu_device_use_default_domain. But
> >     I presume we don't want such non-trivial modifications to that code
> >     at this point.
> > 
> > 3. Modernize: Support CONFIG_IOMMU_DMA on ARM -- since there is an issue
> >     with per-SoC quirks, I think this should be done one SoC at a time.
> >     So come up with a way to dynamically pick between the legacy and
> >     IOMMU_DMA paths. Perhaps if the SMMU driver explicitly requests the
> >     DMA domain type, use the modern path. Currently, CONFIG_IOMMU_DMA and
> >     CONFIG_ARM_DMA_USE_IOMMU are mutually exclusive so that has to be
> >     changed.
> > 
> > FWIW, if we are to move to using DMA API with TegraDRM, one blocker
> > would have to be resolved: boot splashes scanning out while the DMA
> > domain is being set up. Since we cannot really use the iommu-addresses
> > reserved-region device tree bindings with these old devices, my thought
> > is to leave the display memory clients in bypass in tegra-smmu until the
> > display driver has quiesced the hardware and can then call into
> > tegra-smmu to enable translation.
> > 
> > Please let me know what you think and whom I missed in the To/Cc fields.
> 
> TBH I rather feel like the time for converting ARM to iommu-dma has 
> passed - there are drivers which rely on specific behaviours of the ARM 
> IOVA allocator which iommu-dma does not match, and meanwhile iommu-dma 
> continues to grow more server-specific features which would be nothing 
> but bloat on ARMv7 systems with <=2GB of RAM and no virtualisation. At 
> this point I'm inclined to treat the existing DMA ops as legacy code 
> like with alpha/sparc/etc.
> 
> While there is technically an option 4, to have tegra-smmu do what 
> ipmmu-vmsa and mtk_iommu_v1 do and go coercing the ARM dma_iommu_mapping 
> into groups behind the arch code's back, I am also still hoping to get 
> rid of that and the messy probe_finalize step altogether. FWIW my 
> preference would be some form of option 2 - off-hand I imagine you could 
> probably get most of the way there by propagating the ARM mapping 
> through group->iommudata (ironically tegra-smmu being the only driver in 
> the way of that - looks like it could probably do its internal group 
> accounting explicitly in release_device instead), plus one or two 
> special cases to recognise ARM DMA domains in the core code as you say. 
> The more involved, but ultimately neater, option would be to turn the 
> ARM mapping inside-out and make it a proper domain cookie type with the 
> ARM code providing its own definitions of iommu_{get,put}_dma_cookie() 
> and iommu_setup_dma_ops(), so it could then work as a proper 
> IOMMU_DOMAIN_DMA default domain, and we can lose the current 
> ARM-specific identity domain bodges as well. I reckon the impact of that 
> to core code shouldn't be much worse than the existing special-cases it 
> would replace, while on the arch side it should effectively only really 
> redistribute the current arm_setup_iommu_dma_ops() path, so functionally 
> pretty low risk as well. It's just liable to be fiddly to do in 
> manageable steps rather than one giant patch changing everything at once...
> 
> Cheers,
> Robin.
> 

Thanks Robin! I'll take a look at both option 2 and the 'proper' option 
and hopefully come back with some patches :)

Mikko




^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2026-07-28 10:11 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-07-24  7:35 Fixing TegraDRM on multi_v7_defconfig / Enabling DMA API with tegra-smmu Mikko Perttunen
2026-07-27 14:51 ` Robin Murphy
2026-07-28 10:11   ` Mikko Perttunen

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox