Currently, the __iommu_dma_{map/free} functions call iova_{offset/align} making them unsuitable for use with iommu_domains having an IOMMU_DMA_MSI cookie since the cookie's iova_domain member, iovad, is uninitialized.
Now that iommu_dma_get_msi_page() calls __iommu_dma_map() regardless of cookie type, failures are being seen when mapping MSI target addresses for devices attached to UNMANAGED domains. To work around this issue, the iova_domain granule for IOMMU_DMA_MSI cookies is initialized to the value returned by cookie_msi_granule(). Fixes: a44e6657585b ("iommu/dma: Clean up MSI IOVA allocation") Signed-off-by: Nate Watterson <nwatt...@codeaurora.org> --- drivers/iommu/dma-iommu.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/drivers/iommu/dma-iommu.c b/drivers/iommu/dma-iommu.c index 8348f366..d7b0816 100644 --- a/drivers/iommu/dma-iommu.c +++ b/drivers/iommu/dma-iommu.c @@ -127,6 +127,16 @@ int iommu_get_msi_cookie(struct iommu_domain *domain, dma_addr_t base) cookie->msi_iova = base; domain->iova_cookie = cookie; + + /* + * Setup granule for compatibility with __iommu_dma_{alloc/free} and + * add a compile time check to ensure that writing granule won't + * clobber msi_iova. + */ + cookie->iovad.granule = cookie_msi_granule(cookie); + BUILD_BUG_ON(offsetof(struct iova_domain, granule) < + sizeof(cookie->msi_iova)); + return 0; } EXPORT_SYMBOL(iommu_get_msi_cookie); -- Qualcomm Datacenter Technologies, Inc. on behalf of Qualcomm Technologies, Inc. Qualcomm Technologies, Inc. is a member of the Code Aurora Forum, a Linux Foundation Collaborative Project. _______________________________________________ iommu mailing list iommu@lists.linux-foundation.org https://lists.linuxfoundation.org/mailman/listinfo/iommu