[PATCH 1/2] drm/amdgpu: fix ring0 failed on firepro card

Alex Deucher alexdeucher at gmail.com
Fri May 5 13:30:33 UTC 2017


On Fri, May 5, 2017 at 2:45 AM, Chunming Zhou <David1.Zhou at amd.com> wrote:
> the root cause is vram content is lost completely after pci reset.
>
> Change-Id: I012cea984702894410b0f05149fd017bb62b624c
> Signed-off-by: Chunming Zhou <David1.Zhou at amd.com>

Let's see if it makes sense to change the order globally so we can
avoid things like this and unify the sr-iov code as well.  series is:
Acked-by: Alex Deucher <alexander.deucher at amd.com>

> ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 57 ++++++++++++++++++++++++++----
>  1 file changed, 50 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> index 8a75327..b44ecdb 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> @@ -1787,13 +1787,40 @@ static int amdgpu_sriov_reinit_late(struct amdgpu_device *adev)
>         return 0;
>  }
>
> -static int amdgpu_resume(struct amdgpu_device *adev)
> +static int amdgpu_resume_phase1(struct amdgpu_device *adev)
>  {
>         int i, r;
>
>         for (i = 0; i < adev->num_ip_blocks; i++) {
>                 if (!adev->ip_blocks[i].status.valid)
>                         continue;
> +               if (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_COMMON ||
> +                               adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_GMC ||
> +                               adev->ip_blocks[i].version->type ==
> +                               AMD_IP_BLOCK_TYPE_IH) {
> +                       r = adev->ip_blocks[i].version->funcs->resume(adev);
> +                       if (r) {
> +                               DRM_ERROR("resume of IP block <%s> failed %d\n",
> +                                         adev->ip_blocks[i].version->funcs->name, r);
> +                               return r;
> +                       }
> +               }
> +       }
> +
> +       return 0;
> +}
> +
> +static int amdgpu_resume_phase2(struct amdgpu_device *adev)
> +{
> +       int i, r;
> +
> +       for (i = 0; i < adev->num_ip_blocks; i++) {
> +               if (!adev->ip_blocks[i].status.valid)
> +                       continue;
> +               if (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_COMMON ||
> +                               adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_GMC ||
> +                               adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_IH )
> +                       continue;
>                 r = adev->ip_blocks[i].version->funcs->resume(adev);
>                 if (r) {
>                         DRM_ERROR("resume of IP block <%s> failed %d\n",
> @@ -1805,6 +1832,18 @@ static int amdgpu_resume(struct amdgpu_device *adev)
>         return 0;
>  }
>
> +static int amdgpu_resume(struct amdgpu_device *adev)
> +{
> +       int r;
> +
> +       r = amdgpu_resume_phase1(adev);
> +       if (r)
> +               return r;
> +       r = amdgpu_resume_phase2(adev);
> +
> +       return r;
> +}
> +
>  static void amdgpu_device_detect_sriov_bios(struct amdgpu_device *adev)
>  {
>         if (adev->is_atom_fw) {
> @@ -2730,16 +2769,20 @@ int amdgpu_gpu_reset(struct amdgpu_device *adev)
>
>                 if (!r) {
>                         dev_info(adev->dev, "GPU reset succeeded, trying to resume\n");
> -                       r = amdgpu_resume(adev);
> +                       r = amdgpu_resume_phase1(adev);
> +                       if (r)
> +                               goto out;
> +                       r = amdgpu_ttm_recover_gart(adev);
> +                       if (r)
> +                               goto out;
> +                       r = amdgpu_resume_phase2(adev);
> +                       if (r)
> +                               goto out;
>                 }
>         }
> +out:
>         if (!r) {
>                 amdgpu_irq_gpu_reset_resume_helper(adev);
> -               if (need_full_reset && amdgpu_need_backup(adev)) {
> -                       r = amdgpu_ttm_recover_gart(adev);
> -                       if (r)
> -                               DRM_ERROR("gart recovery failed!!!\n");
> -               }
>                 r = amdgpu_ib_ring_tests(adev);
>                 if (r) {
>                         dev_err(adev->dev, "ib ring test failed (%d).\n", r);
> --
> 1.9.1
>
> _______________________________________________
> amd-gfx mailing list
> amd-gfx at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/amd-gfx


More information about the amd-gfx mailing list