Re: [PATCH v16 3/3] of: Respect #{iommu,msi}-cells in maps
Dmitry Baryshkov <[email protected]> Tue, 28 Jul 2026 14:34:38 +0300
| Newsgroups | dev.linux.lists.iommu,dev.linux.lists.imx,org.infradead.lists.linux-arm-kernel,org.kernel.vger.linux-arm-msm,org.kernel.vger.linux-devicetree,org.kernel.vger.linux-kernel,org.kernel.vger.linux-pci,org.xenproject.lists.xen-devel |
|---|---|
| Message-ID | <fuqnxdknkajqotzmmlknwnthqpku7as5kpvmgogexl5bi7x6y4@tthbasf5lqvc> |
On Thu, Jul 23, 2026 at 03:17:24PM +0200, Neil Armstrong wrote: > Hi, > > On 6/3/26 09:13, Vijayanand Jitta wrote: > > From: Robin Murphy <[email protected]> > > > > So far our parsing of {iommu,msi}-map properties has always blindly > > assumed that the output specifiers will always have exactly 1 cell. > > This typically does happen to be the case, but is not actually enforced > > (and the PCI msi-map binding even explicitly states support for 0 or 1 > > cells) - as a result we've now ended up with dodgy DTs out in the field > > which depend on this behaviour to map a 1-cell specifier for a 2-cell > > provider, despite that being bogus per the bindings themselves. > > > > Since there is some potential use in being able to map at least single > > input IDs to multi-cell output specifiers (and properly support 0-cell > > outputs as well), add support for properly parsing and using the target > > nodes' #cells values, albeit with the unfortunate complication of still > > having to work around expectations of the old behaviour too. > > > > Since there are multi-cell output specifiers, the callers of of_map_id() > > may need to get the exact cell output value for further processing. > > Update of_map_id() to set args_count in the output to reflect the actual > > number of output specifier cells. > > > > Signed-off-by: Robin Murphy <[email protected]> > > Signed-off-by: Charan Teja Kalla <[email protected]> > > Signed-off-by: Vijayanand Jitta <[email protected]> > > --- > > drivers/of/base.c | 168 +++++++++++++++++++++++++++++++++++++++++------------ > > include/linux/of.h | 6 +- > > 2 files changed, 135 insertions(+), 39 deletions(-) > > > > diff --git a/drivers/of/base.c b/drivers/of/base.c > > index d658c2620135..ac7961cbab94 100644 > > --- a/drivers/of/base.c > > +++ b/drivers/of/base.c > > @@ -2116,19 +2116,49 @@ int of_find_last_cache_level(unsigned int cpu) > > return cache_level; > > } > > +/* > > + * Some DTs have an iommu-map targeting a 2-cell IOMMU node while > > + * specifying only 1 cell. Fortunately they all consist of value '1' > > + * as the 2nd cell entry with the same target, so check for that pattern. > > + * > > + * Example: > > + * IOMMU node: > > + * #iommu-cells = <2>; > > + * > > + * Device node: > > + * iommu-map = <0x0000 &smmu 0x0000 0x1>, > > + * <0x0100 &smmu 0x0100 0x1>; > > So the sm8650 PCIe controllers has: > > pcie@1c08000: > iommu-map = <0 &apps_smmu 0x1480 0x1>, > <0x100 &apps_smmu 0x1481 0x1>; To silence the warning, update the iommu maps to: iommu-map = <0 &apps_smmu 0x1480 0x0 0x1>, <0x100 &apps_smmu 0x1481 0x0 0x1>; -- With best wishes Dmitry