Commit e04c7487 authored by Jason Gunthorpe's avatar Jason Gunthorpe Committed by Joerg Roedel

iommu: Add IOMMU_DOMAIN_PLATFORM for S390

The PLATFORM domain will be set as the default domain and attached as
normal during probe. The driver will ignore the initial attach from a NULL
domain to the PLATFORM domain.

After this, the PLATFORM domain's attach_dev will be called whenever we
detach from an UNMANAGED domain (eg for VFIO). This is the same time the
original design would have called op->detach_dev().

This is temporary until the S390 dma-iommu.c conversion is merged.
Tested-by: default avatarHeiko Stuebner <heiko@sntech.de>
Tested-by: default avatarNiklas Schnelle <schnelle@linux.ibm.com>
Reviewed-by: default avatarLu Baolu <baolu.lu@linux.intel.com>
Reviewed-by: default avatarJerry Snitselaar <jsnitsel@redhat.com>
Signed-off-by: default avatarJason Gunthorpe <jgg@nvidia.com>
Link: https://lore.kernel.org/r/4-v8-81230027b2fa+9d-iommu_all_defdom_jgg@nvidia.comSigned-off-by: default avatarJoerg Roedel <jroedel@suse.de>
parent 2ad56efa
...@@ -142,14 +142,31 @@ static int s390_iommu_attach_device(struct iommu_domain *domain, ...@@ -142,14 +142,31 @@ static int s390_iommu_attach_device(struct iommu_domain *domain,
return 0; return 0;
} }
static void s390_iommu_set_platform_dma(struct device *dev) /*
* Switch control over the IOMMU to S390's internal dma_api ops
*/
static int s390_iommu_platform_attach(struct iommu_domain *platform_domain,
struct device *dev)
{ {
struct zpci_dev *zdev = to_zpci_dev(dev); struct zpci_dev *zdev = to_zpci_dev(dev);
if (!zdev->s390_domain)
return 0;
__s390_iommu_detach_device(zdev); __s390_iommu_detach_device(zdev);
zpci_dma_init_device(zdev); zpci_dma_init_device(zdev);
return 0;
} }
static struct iommu_domain_ops s390_iommu_platform_ops = {
.attach_dev = s390_iommu_platform_attach,
};
static struct iommu_domain s390_iommu_platform_domain = {
.type = IOMMU_DOMAIN_PLATFORM,
.ops = &s390_iommu_platform_ops,
};
static void s390_iommu_get_resv_regions(struct device *dev, static void s390_iommu_get_resv_regions(struct device *dev,
struct list_head *list) struct list_head *list)
{ {
...@@ -428,12 +445,12 @@ void zpci_destroy_iommu(struct zpci_dev *zdev) ...@@ -428,12 +445,12 @@ void zpci_destroy_iommu(struct zpci_dev *zdev)
} }
static const struct iommu_ops s390_iommu_ops = { static const struct iommu_ops s390_iommu_ops = {
.default_domain = &s390_iommu_platform_domain,
.capable = s390_iommu_capable, .capable = s390_iommu_capable,
.domain_alloc = s390_domain_alloc, .domain_alloc = s390_domain_alloc,
.probe_device = s390_iommu_probe_device, .probe_device = s390_iommu_probe_device,
.release_device = s390_iommu_release_device, .release_device = s390_iommu_release_device,
.device_group = generic_device_group, .device_group = generic_device_group,
.set_platform_dma_ops = s390_iommu_set_platform_dma,
.pgsize_bitmap = SZ_4K, .pgsize_bitmap = SZ_4K,
.get_resv_regions = s390_iommu_get_resv_regions, .get_resv_regions = s390_iommu_get_resv_regions,
.default_domain_ops = &(const struct iommu_domain_ops) { .default_domain_ops = &(const struct iommu_domain_ops) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment