iommu/arm-smmu: Work around ARM DMA configuration
The 32-bit ARM DMA configuration code predates the IOMMU core's default domain functionality, and instead relies on allocating its own domains and attaching any devices using the generic IOMMU binding to them. Unfortunately, it does this relatively early on in the creation of the device, before we've seen our add_device callback, which leads us to attempt to operate on a half-configured master. To avoid a crash, check for this situation on attach, but refuse to play, as there's nothing we can do. This at least allows VFIO to keep working for people who update their 32-bit DTs to the generic binding, albeit with a few (innocuous) warnings from the DMA layer on boot. Signed-off-by: Robin Murphy <robin.murphy@arm.com> Signed-off-by: Will Deacon <will.deacon@arm.com> Signed-off-by: Joerg Roedel <jroedel@suse.de>
This commit is contained in:
Родитель
bc33b0ca11
Коммит
fba4f8e5c4
|
@ -1228,6 +1228,16 @@ static int arm_smmu_attach_dev(struct iommu_domain *domain, struct device *dev)
|
||||||
return -ENXIO;
|
return -ENXIO;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* FIXME: The arch/arm DMA API code tries to attach devices to its own
|
||||||
|
* domains between of_xlate() and add_device() - we have no way to cope
|
||||||
|
* with that, so until ARM gets converted to rely on groups and default
|
||||||
|
* domains, just say no (but more politely than by dereferencing NULL).
|
||||||
|
* This should be at least a WARN_ON once that's sorted.
|
||||||
|
*/
|
||||||
|
if (!fwspec->iommu_priv)
|
||||||
|
return -ENODEV;
|
||||||
|
|
||||||
smmu = fwspec_smmu(fwspec);
|
smmu = fwspec_smmu(fwspec);
|
||||||
/* Ensure that the domain is finalised */
|
/* Ensure that the domain is finalised */
|
||||||
ret = arm_smmu_init_domain_context(domain, smmu);
|
ret = arm_smmu_init_domain_context(domain, smmu);
|
||||||
|
|
Загрузка…
Ссылка в новой задаче