[PATCH v16 3/3] of: Respect #{iommu,msi}-cells in maps
Neil Armstrong
neil.armstrong at linaro.org
Tue Jul 28 05:58:11 PDT 2026
On 7/28/26 13:34, Dmitry Baryshkov wrote:
> 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 <robin.murphy at arm.com>
>>>
>>> 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 <robin.murphy at arm.com>
>>> Signed-off-by: Charan Teja Kalla <charan.kalla at oss.qualcomm.com>
>>> Signed-off-by: Vijayanand Jitta <vijayanand.jitta at oss.qualcomm.com>
>>> ---
>>> 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 at 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>;
>
>
Will do, I was surprised none of the DT were fixed.
Thanks,
Neil
More information about the linux-arm-kernel
mailing list