forked from Minki/linux
iommu/fsl: Fix the device domain attach condition.
Store the domain information for the device, only if it's not already attached to a domain. Signed-off-by: Varun Sethi <Varun.Sethi@freescale.com> Signed-off-by: Joerg Roedel <jroedel@suse.de>
This commit is contained in:
parent
d033f48f3a
commit
75f0e4615d
@ -335,11 +335,6 @@ static struct fsl_dma_domain *iommu_alloc_dma_domain(void)
|
|||||||
return domain;
|
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)
|
static void remove_device_ref(struct device_domain_info *info, u32 win_cnt)
|
||||||
{
|
{
|
||||||
unsigned long flags;
|
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.
|
* Check here if the device is already attached to domain or not.
|
||||||
* If the device is already attached to a domain detach it.
|
* 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) {
|
if (old_domain_info && old_domain_info->domain != dma_domain) {
|
||||||
spin_unlock_irqrestore(&device_domain_lock, flags);
|
spin_unlock_irqrestore(&device_domain_lock, flags);
|
||||||
detach_device(dev, old_domain_info->domain);
|
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
|
* the info for the first LIODN as all
|
||||||
* LIODNs share the same domain
|
* LIODNs share the same domain
|
||||||
*/
|
*/
|
||||||
if (!old_domain_info)
|
if (!dev->archdata.iommu_domain)
|
||||||
dev->archdata.iommu_domain = info;
|
dev->archdata.iommu_domain = info;
|
||||||
spin_unlock_irqrestore(&device_domain_lock, flags);
|
spin_unlock_irqrestore(&device_domain_lock, flags);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user