diff options
| -rw-r--r-- | arch/powerpc/kernel/iommu.c | 38 | 
1 files changed, 17 insertions, 21 deletions
| diff --git a/arch/powerpc/kernel/iommu.c b/arch/powerpc/kernel/iommu.c index 14251bc5219e..d6ad3fde85a2 100644 --- a/arch/powerpc/kernel/iommu.c +++ b/arch/powerpc/kernel/iommu.c @@ -1280,7 +1280,7 @@ struct iommu_table_group_ops spapr_tce_table_group_ops = {  /*   * A simple iommu_ops to allow less cruft in generic VFIO code.   */ -static int spapr_tce_blocking_iommu_attach_dev(struct iommu_domain *dom, +static int spapr_tce_platform_iommu_attach_dev(struct iommu_domain *dom,  					       struct device *dev)  {  	struct iommu_group *grp = iommu_group_get(dev); @@ -1297,17 +1297,22 @@ static int spapr_tce_blocking_iommu_attach_dev(struct iommu_domain *dom,  	return ret;  } -static void spapr_tce_blocking_iommu_set_platform_dma(struct device *dev) -{ -	struct iommu_group *grp = iommu_group_get(dev); -	struct iommu_table_group *table_group; +static const struct iommu_domain_ops spapr_tce_platform_domain_ops = { +	.attach_dev = spapr_tce_platform_iommu_attach_dev, +}; -	table_group = iommu_group_get_iommudata(grp); -	table_group->ops->release_ownership(table_group); -} +static struct iommu_domain spapr_tce_platform_domain = { +	.type = IOMMU_DOMAIN_PLATFORM, +	.ops = &spapr_tce_platform_domain_ops, +}; -static const struct iommu_domain_ops spapr_tce_blocking_domain_ops = { -	.attach_dev = spapr_tce_blocking_iommu_attach_dev, +static struct iommu_domain spapr_tce_blocked_domain = { +	.type = IOMMU_DOMAIN_BLOCKED, +	/* +	 * FIXME: SPAPR mixes blocked and platform behaviors, the blocked domain +	 * also sets the dma_api ops +	 */ +	.ops = &spapr_tce_platform_domain_ops,  };  static bool spapr_tce_iommu_capable(struct device *dev, enum iommu_cap cap) @@ -1324,18 +1329,9 @@ static bool spapr_tce_iommu_capable(struct device *dev, enum iommu_cap cap)  static struct iommu_domain *spapr_tce_iommu_domain_alloc(unsigned int type)  { -	struct iommu_domain *dom; -  	if (type != IOMMU_DOMAIN_BLOCKED)  		return NULL; - -	dom = kzalloc(sizeof(*dom), GFP_KERNEL); -	if (!dom) -		return NULL; - -	dom->ops = &spapr_tce_blocking_domain_ops; - -	return dom; +	return &spapr_tce_blocked_domain;  }  static struct iommu_device *spapr_tce_iommu_probe_device(struct device *dev) @@ -1371,12 +1367,12 @@ static struct iommu_group *spapr_tce_iommu_device_group(struct device *dev)  }  static const struct iommu_ops spapr_tce_iommu_ops = { +	.default_domain = &spapr_tce_platform_domain,  	.capable = spapr_tce_iommu_capable,  	.domain_alloc = spapr_tce_iommu_domain_alloc,  	.probe_device = spapr_tce_iommu_probe_device,  	.release_device = spapr_tce_iommu_release_device,  	.device_group = spapr_tce_iommu_device_group, -	.set_platform_dma_ops = spapr_tce_blocking_iommu_set_platform_dma,  };  static struct attribute *spapr_tce_iommu_attrs[] = { | 
