Message ID | 20240614142156.29420-10-zong.li@sifive.com (mailing list archive) |
---|---|
State | RFC |
Headers | show |
Series | RISC-V IOMMU HPM and nested IOMMU support | expand |
Context | Check | Description |
---|---|---|
conchuod/vmtest-fixes-PR | fail | merge-conflict |
On Fri, Jun 14, 2024 at 10:21:55PM +0800, Zong Li wrote: > From: Robin Murphy <robin.murphy@arm.com> > > Currently, iommu-dma is the only place outside of IOMMUFD and drivers > which might need to be aware of the stage 2 domain encapsulated within > a nested domain. This would be in the legacy-VFIO-style case where we're > using host-managed MSIs with an identity mapping at stage 1, where it is > the underlying stage 2 domain which owns an MSI cookie and holds the > corresponding dynamic mappings. Hook up the new op to resolve what we > need from a nested domain. > > Signed-off-by: Robin Murphy <robin.murphy@arm.com> > Signed-off-by: Nicolin Chen <nicolinc@nvidia.com> I think there should be your Signed-off line at the end since you act as a submitter :) Thanks Nicolin
On Sat, Jun 15, 2024 at 2:12 AM Nicolin Chen <nicolinc@nvidia.com> wrote: > > On Fri, Jun 14, 2024 at 10:21:55PM +0800, Zong Li wrote: > > From: Robin Murphy <robin.murphy@arm.com> > > > > Currently, iommu-dma is the only place outside of IOMMUFD and drivers > > which might need to be aware of the stage 2 domain encapsulated within > > a nested domain. This would be in the legacy-VFIO-style case where we're > > using host-managed MSIs with an identity mapping at stage 1, where it is > > the underlying stage 2 domain which owns an MSI cookie and holds the > > corresponding dynamic mappings. Hook up the new op to resolve what we > > need from a nested domain. > > > > Signed-off-by: Robin Murphy <robin.murphy@arm.com> > > Signed-off-by: Nicolin Chen <nicolinc@nvidia.com> > > I think there should be your Signed-off line at the end since you > act as a submitter :) Got it, add it in the next version, thanks. > > Thanks > Nicolin
diff --git a/drivers/iommu/dma-iommu.c b/drivers/iommu/dma-iommu.c index f731e4b2a417..d4235bb0a427 100644 --- a/drivers/iommu/dma-iommu.c +++ b/drivers/iommu/dma-iommu.c @@ -1806,6 +1806,20 @@ static struct iommu_dma_msi_page *iommu_dma_get_msi_page(struct device *dev, return NULL; } +/* + * Nested domains may not have an MSI cookie or accept mappings, but they may + * be related to a domain which does, so we let them tell us what they need. + */ +static struct iommu_domain *iommu_dma_get_msi_mapping_domain(struct device *dev) +{ + struct iommu_domain *domain = iommu_get_domain_for_dev(dev); + + if (domain && domain->type == IOMMU_DOMAIN_NESTED && + domain->ops->get_msi_mapping_domain) + domain = domain->ops->get_msi_mapping_domain(domain); + return domain; +} + /** * iommu_dma_prepare_msi() - Map the MSI page in the IOMMU domain * @desc: MSI descriptor, will store the MSI page @@ -1816,7 +1830,7 @@ static struct iommu_dma_msi_page *iommu_dma_get_msi_page(struct device *dev, int iommu_dma_prepare_msi(struct msi_desc *desc, phys_addr_t msi_addr) { struct device *dev = msi_desc_to_dev(desc); - struct iommu_domain *domain = iommu_get_domain_for_dev(dev); + struct iommu_domain *domain = iommu_dma_get_msi_mapping_domain(dev); struct iommu_dma_msi_page *msi_page; static DEFINE_MUTEX(msi_prepare_lock); /* see below */ @@ -1849,7 +1863,7 @@ int iommu_dma_prepare_msi(struct msi_desc *desc, phys_addr_t msi_addr) void iommu_dma_compose_msi_msg(struct msi_desc *desc, struct msi_msg *msg) { struct device *dev = msi_desc_to_dev(desc); - const struct iommu_domain *domain = iommu_get_domain_for_dev(dev); + const struct iommu_domain *domain = iommu_dma_get_msi_mapping_domain(dev); const struct iommu_dma_msi_page *msi_page; msi_page = msi_desc_get_iommu_cookie(desc); diff --git a/include/linux/iommu.h b/include/linux/iommu.h index 7bc8dff7cf6d..400df9ae7012 100644 --- a/include/linux/iommu.h +++ b/include/linux/iommu.h @@ -629,6 +629,8 @@ struct iommu_ops { * @enable_nesting: Enable nesting * @set_pgtable_quirks: Set io page table quirks (IO_PGTABLE_QUIRK_*) * @free: Release the domain after use. + * @get_msi_mapping_domain: Return the related iommu_domain that should hold the + * MSI cookie and accept mapping(s). */ struct iommu_domain_ops { int (*attach_dev)(struct iommu_domain *domain, struct device *dev); @@ -659,6 +661,8 @@ struct iommu_domain_ops { unsigned long quirks); void (*free)(struct iommu_domain *domain); + struct iommu_domain * + (*get_msi_mapping_domain)(struct iommu_domain *domain); }; /**