diff options
Diffstat (limited to 'drivers/iommu/amd_iommu.c')
| -rw-r--r-- | drivers/iommu/amd_iommu.c | 34 | 
1 files changed, 16 insertions, 18 deletions
diff --git a/drivers/iommu/amd_iommu.c b/drivers/iommu/amd_iommu.c index 98f555dafb5..830183737b0 100644 --- a/drivers/iommu/amd_iommu.c +++ b/drivers/iommu/amd_iommu.c @@ -173,7 +173,7 @@ static inline u16 get_device_id(struct device *dev)  {  	struct pci_dev *pdev = to_pci_dev(dev); -	return calc_devid(pdev->bus->number, pdev->devfn); +	return PCI_DEVID(pdev->bus->number, pdev->devfn);  }  static struct iommu_dev_data *get_dev_data(struct device *dev) @@ -649,26 +649,26 @@ retry:  	case EVENT_TYPE_ILL_DEV:  		printk("ILLEGAL_DEV_TABLE_ENTRY device=%02x:%02x.%x "  		       "address=0x%016llx flags=0x%04x]\n", -		       PCI_BUS(devid), PCI_SLOT(devid), PCI_FUNC(devid), +		       PCI_BUS_NUM(devid), PCI_SLOT(devid), PCI_FUNC(devid),  		       address, flags);  		dump_dte_entry(devid);  		break;  	case EVENT_TYPE_IO_FAULT:  		printk("IO_PAGE_FAULT device=%02x:%02x.%x "  		       "domain=0x%04x address=0x%016llx flags=0x%04x]\n", -		       PCI_BUS(devid), PCI_SLOT(devid), PCI_FUNC(devid), +		       PCI_BUS_NUM(devid), PCI_SLOT(devid), PCI_FUNC(devid),  		       domid, address, flags);  		break;  	case EVENT_TYPE_DEV_TAB_ERR:  		printk("DEV_TAB_HARDWARE_ERROR device=%02x:%02x.%x "  		       "address=0x%016llx flags=0x%04x]\n", -		       PCI_BUS(devid), PCI_SLOT(devid), PCI_FUNC(devid), +		       PCI_BUS_NUM(devid), PCI_SLOT(devid), PCI_FUNC(devid),  		       address, flags);  		break;  	case EVENT_TYPE_PAGE_TAB_ERR:  		printk("PAGE_TAB_HARDWARE_ERROR device=%02x:%02x.%x "  		       "domain=0x%04x address=0x%016llx flags=0x%04x]\n", -		       PCI_BUS(devid), PCI_SLOT(devid), PCI_FUNC(devid), +		       PCI_BUS_NUM(devid), PCI_SLOT(devid), PCI_FUNC(devid),  		       domid, address, flags);  		break;  	case EVENT_TYPE_ILL_CMD: @@ -682,13 +682,13 @@ retry:  	case EVENT_TYPE_IOTLB_INV_TO:  		printk("IOTLB_INV_TIMEOUT device=%02x:%02x.%x "  		       "address=0x%016llx]\n", -		       PCI_BUS(devid), PCI_SLOT(devid), PCI_FUNC(devid), +		       PCI_BUS_NUM(devid), PCI_SLOT(devid), PCI_FUNC(devid),  		       address);  		break;  	case EVENT_TYPE_INV_DEV_REQ:  		printk("INVALID_DEVICE_REQUEST device=%02x:%02x.%x "  		       "address=0x%016llx flags=0x%04x]\n", -		       PCI_BUS(devid), PCI_SLOT(devid), PCI_FUNC(devid), +		       PCI_BUS_NUM(devid), PCI_SLOT(devid), PCI_FUNC(devid),  		       address, flags);  		break;  	default: @@ -2466,18 +2466,16 @@ static int device_change_notifier(struct notifier_block *nb,  		/* allocate a protection domain if a device is added */  		dma_domain = find_protection_domain(devid); -		if (dma_domain) -			goto out; -		dma_domain = dma_ops_domain_alloc(); -		if (!dma_domain) -			goto out; -		dma_domain->target_dev = devid; - -		spin_lock_irqsave(&iommu_pd_list_lock, flags); -		list_add_tail(&dma_domain->list, &iommu_pd_list); -		spin_unlock_irqrestore(&iommu_pd_list_lock, flags); +		if (!dma_domain) { +			dma_domain = dma_ops_domain_alloc(); +			if (!dma_domain) +				goto out; +			dma_domain->target_dev = devid; -		dev_data = get_dev_data(dev); +			spin_lock_irqsave(&iommu_pd_list_lock, flags); +			list_add_tail(&dma_domain->list, &iommu_pd_list); +			spin_unlock_irqrestore(&iommu_pd_list_lock, flags); +		}  		dev->archdata.dma_ops = &amd_iommu_dma_ops;  |