diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c | 42 | 
1 files changed, 42 insertions, 0 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c index 425596c2f6f8..617fcbafc75d 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c @@ -124,6 +124,22 @@ void amdgpu_register_gpu_instance(struct amdgpu_device *adev)  	mutex_unlock(&mgpu_info.mutex);  } +static void amdgpu_get_audio_func(struct amdgpu_device *adev) +{ +	struct pci_dev *p = NULL; + +	p = pci_get_domain_bus_and_slot(pci_domain_nr(adev->pdev->bus), +			adev->pdev->bus->number, 1); +	if (p) { +		pm_runtime_get_sync(&p->dev); + +		pm_runtime_mark_last_busy(&p->dev); +		pm_runtime_put_autosuspend(&p->dev); + +		pci_dev_put(p); +	} +} +  /**   * amdgpu_driver_load_kms - Main load function for KMS.   * @@ -213,9 +229,35 @@ int amdgpu_driver_load_kms(struct amdgpu_device *adev, unsigned long flags)  						DPM_FLAG_MAY_SKIP_RESUME);  		pm_runtime_use_autosuspend(dev->dev);  		pm_runtime_set_autosuspend_delay(dev->dev, 5000); +  		pm_runtime_allow(dev->dev); +  		pm_runtime_mark_last_busy(dev->dev);  		pm_runtime_put_autosuspend(dev->dev); + +		/* +		 * For runpm implemented via BACO, PMFW will handle the +		 * timing for BACO in and out: +		 *   - put ASIC into BACO state only when both video and +		 *     audio functions are in D3 state. +		 *   - pull ASIC out of BACO state when either video or +		 *     audio function is in D0 state. +		 * Also, at startup, PMFW assumes both functions are in +		 * D0 state. +		 * +		 * So if snd driver was loaded prior to amdgpu driver +		 * and audio function was put into D3 state, there will +		 * be no PMFW-aware D-state transition(D0->D3) on runpm +		 * suspend. Thus the BACO will be not correctly kicked in. +		 * +		 * Via amdgpu_get_audio_func(), the audio dev is put +		 * into D0 state. Then there will be a PMFW-aware D-state +		 * transition(D0->D3) on runpm suspend. +		 */ +		if (amdgpu_device_supports_baco(dev) && +		    !(adev->flags & AMD_IS_APU) && +		    (adev->asic_type >= CHIP_NAVI10)) +			amdgpu_get_audio_func(adev);  	}  	if (amdgpu_acpi_smart_shift_update(dev, AMDGPU_SS_DRV_LOAD))  | 
