|
|
@@ -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);
|
|
|
|
|
|
@@ -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;
|
|
|
@@ -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);
|