diff options
| -rw-r--r-- | drivers/iommu/amd_iommu_init.c | 30 | 
1 files changed, 20 insertions, 10 deletions
diff --git a/drivers/iommu/amd_iommu_init.c b/drivers/iommu/amd_iommu_init.c index 526652a7385..182b80ba79c 100644 --- a/drivers/iommu/amd_iommu_init.c +++ b/drivers/iommu/amd_iommu_init.c @@ -1123,8 +1123,9 @@ static int iommu_setup_msi(struct amd_iommu *iommu)  {  	int r; -	if (pci_enable_msi(iommu->dev)) -		return 1; +	r = pci_enable_msi(iommu->dev); +	if (r) +		return r;  	r = request_threaded_irq(iommu->dev->irq,  				 amd_iommu_int_handler, @@ -1134,27 +1135,36 @@ static int iommu_setup_msi(struct amd_iommu *iommu)  	if (r) {  		pci_disable_msi(iommu->dev); -		return 1; +		return r;  	}  	iommu->int_enabled = true; -	iommu_feature_enable(iommu, CONTROL_EVT_INT_EN); - -	if (iommu->ppr_log != NULL) -		iommu_feature_enable(iommu, CONTROL_PPFINT_EN);  	return 0;  }  static int iommu_init_msi(struct amd_iommu *iommu)  { +	int ret; +  	if (iommu->int_enabled) -		return 0; +		goto enable_faults;  	if (pci_find_capability(iommu->dev, PCI_CAP_ID_MSI)) -		return iommu_setup_msi(iommu); +		ret = iommu_setup_msi(iommu); +	else +		ret = -ENODEV; -	return 1; +	if (ret) +		return ret; + +enable_faults: +	iommu_feature_enable(iommu, CONTROL_EVT_INT_EN); + +	if (iommu->ppr_log != NULL) +		iommu_feature_enable(iommu, CONTROL_PPFINT_EN); + +	return 0;  }  /****************************************************************************  |