diff options
Diffstat (limited to 'drivers/iommu/fsl_pamu_domain.c')
| -rw-r--r-- | drivers/iommu/fsl_pamu_domain.c | 24 | 
1 files changed, 11 insertions, 13 deletions
diff --git a/drivers/iommu/fsl_pamu_domain.c b/drivers/iommu/fsl_pamu_domain.c index c857c30da97..af47648301a 100644 --- a/drivers/iommu/fsl_pamu_domain.c +++ b/drivers/iommu/fsl_pamu_domain.c @@ -301,7 +301,7 @@ static int check_size(u64 size, dma_addr_t iova)  	 * Size must be a power of two and at least be equal  	 * to PAMU page size.  	 */ -	if (!is_power_of_2(size) || size < PAMU_PAGE_SIZE) { +	if ((size & (size - 1)) || size < PAMU_PAGE_SIZE) {  		pr_debug("%s: size too small or not a power of two\n", __func__);  		return -EINVAL;  	} @@ -335,11 +335,6 @@ static struct fsl_dma_domain *iommu_alloc_dma_domain(void)  	return domain;  } -static inline struct device_domain_info *find_domain(struct device *dev) -{ -	return dev->archdata.iommu_domain; -} -  static void remove_device_ref(struct device_domain_info *info, u32 win_cnt)  {  	unsigned long flags; @@ -380,7 +375,7 @@ static void attach_device(struct fsl_dma_domain *dma_domain, int liodn, struct d  	 * Check here if the device is already attached to domain or not.  	 * If the device is already attached to a domain detach it.  	 */ -	old_domain_info = find_domain(dev); +	old_domain_info = dev->archdata.iommu_domain;  	if (old_domain_info && old_domain_info->domain != dma_domain) {  		spin_unlock_irqrestore(&device_domain_lock, flags);  		detach_device(dev, old_domain_info->domain); @@ -399,7 +394,7 @@ static void attach_device(struct fsl_dma_domain *dma_domain, int liodn, struct d  	 * the info for the first LIODN as all  	 * LIODNs share the same domain  	 */ -	if (!old_domain_info) +	if (!dev->archdata.iommu_domain)  		dev->archdata.iommu_domain = info;  	spin_unlock_irqrestore(&device_domain_lock, flags); @@ -691,7 +686,7 @@ static int fsl_pamu_attach_device(struct iommu_domain *domain,  	 * Use LIODN of the PCI controller while attaching a  	 * PCI device.  	 */ -	if (dev->bus == &pci_bus_type) { +	if (dev_is_pci(dev)) {  		pdev = to_pci_dev(dev);  		pci_ctl = pci_bus_to_host(pdev->bus);  		/* @@ -729,7 +724,7 @@ static void fsl_pamu_detach_device(struct iommu_domain *domain,  	 * Use LIODN of the PCI controller while detaching a  	 * PCI device.  	 */ -	if (dev->bus == &pci_bus_type) { +	if (dev_is_pci(dev)) {  		pdev = to_pci_dev(dev);  		pci_ctl = pci_bus_to_host(pdev->bus);  		/* @@ -1042,12 +1037,15 @@ root_bus:  			group = get_shared_pci_device_group(pdev);  	} +	if (!group) +		group = ERR_PTR(-ENODEV); +  	return group;  }  static int fsl_pamu_add_device(struct device *dev)  { -	struct iommu_group *group = NULL; +	struct iommu_group *group = ERR_PTR(-ENODEV);  	struct pci_dev *pdev;  	const u32 *prop;  	int ret, len; @@ -1056,7 +1054,7 @@ static int fsl_pamu_add_device(struct device *dev)  	 * For platform devices we allocate a separate group for  	 * each of the devices.  	 */ -	if (dev->bus == &pci_bus_type) { +	if (dev_is_pci(dev)) {  		pdev = to_pci_dev(dev);  		/* Don't create device groups for virtual PCI bridges */  		if (pdev->subordinate) @@ -1070,7 +1068,7 @@ static int fsl_pamu_add_device(struct device *dev)  			group = get_device_iommu_group(dev);  	} -	if (!group || IS_ERR(group)) +	if (IS_ERR(group))  		return PTR_ERR(group);  	ret = iommu_group_add_device(group, dev);  | 
