diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c | 18 | 
1 files changed, 18 insertions, 0 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c index 32ce0e679dc7..83af307e97cd 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c @@ -278,6 +278,21 @@ static bool amdgpu_msi_ok(struct amdgpu_device *adev)  	return true;  } +static void amdgpu_restore_msix(struct amdgpu_device *adev) +{ +	u16 ctrl; + +	pci_read_config_word(adev->pdev, adev->pdev->msix_cap + PCI_MSIX_FLAGS, &ctrl); +	if (!(ctrl & PCI_MSIX_FLAGS_ENABLE)) +		return; + +	/* VF FLR */ +	ctrl &= ~PCI_MSIX_FLAGS_ENABLE; +	pci_write_config_word(adev->pdev, adev->pdev->msix_cap + PCI_MSIX_FLAGS, ctrl); +	ctrl |= PCI_MSIX_FLAGS_ENABLE; +	pci_write_config_word(adev->pdev, adev->pdev->msix_cap + PCI_MSIX_FLAGS, ctrl); +} +  /**   * amdgpu_irq_init - initialize interrupt handling   * @@ -569,6 +584,9 @@ void amdgpu_irq_gpu_reset_resume_helper(struct amdgpu_device *adev)  {  	int i, j, k; +	if (amdgpu_sriov_vf(adev)) +		amdgpu_restore_msix(adev); +  	for (i = 0; i < AMDGPU_IRQ_CLIENTID_MAX; ++i) {  		if (!adev->irq.client[i].sources)  			continue;  | 
