[PATCH 1/3] drm/amdgpu: wait for all rings to drain before runtime suspending
Andrey Grodzovsky
Andrey.Grodzovsky at amd.com
Tue Dec 17 15:57:05 UTC 2019
Reviewed-by: Andrey Grodzovsky <andrey.grodzovsky at amd.com>
Andrey
On 12/16/19 12:18 PM, Alex Deucher wrote:
> Add a safety check to runtime suspend to make sure all outstanding
> fences have signaled before we suspend. Doesn't fix any known issue.
>
> We already do this via the fence driver suspend function, but we
> just force completion rather than bailing. This bails on runtime
> suspend so we can try again later once the fences are signaled to
> avoid missing any outstanding work.
>
> Signed-off-by: Alex Deucher <alexander.deucher at amd.com>
> ---
> drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c | 12 +++++++++++-
> 1 file changed, 11 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
> index d1e9946ac218..61dc26515c7e 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
> @@ -1214,13 +1214,23 @@ static int amdgpu_pmops_runtime_suspend(struct device *dev)
> struct pci_dev *pdev = to_pci_dev(dev);
> struct drm_device *drm_dev = pci_get_drvdata(pdev);
> struct amdgpu_device *adev = drm_dev->dev_private;
> - int ret;
> + int ret, i;
>
> if (!adev->runpm) {
> pm_runtime_forbid(dev);
> return -EBUSY;
> }
>
> + /* wait for all rings to drain before suspending */
> + for (i = 0; i < AMDGPU_MAX_RINGS; i++) {
> + struct amdgpu_ring *ring = adev->rings[i];
> + if (ring && ring->sched.ready) {
> + ret = amdgpu_fence_wait_empty(ring);
> + if (ret)
> + return -EBUSY;
> + }
> + }
> +
> if (amdgpu_device_supports_boco(drm_dev))
> drm_dev->switch_power_state = DRM_SWITCH_POWER_CHANGING;
> drm_kms_helper_poll_disable(drm_dev);
More information about the amd-gfx
mailing list