diff options
author | Chunming Zhou <David1.Zhou@amd.com> | 2017-05-04 22:33:33 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2017-05-24 17:40:32 -0400 |
commit | fcf0649fcc71d1d6a8d45d7cba21b6a0ad6489b7 (patch) | |
tree | ff34e48db1fc9ca694aedf1c87a7b35631542ee4 /drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | |
parent | 738f64ccc237f80b7673a6cc43051916eb90dc27 (diff) |
drm/amdgpu: fix ring0 failed on pro card
the root cause is vram content is lost completely after pci reset.
Signed-off-by: Chunming Zhou <David1.Zhou@amd.com>
Reviewed-by: Roger.He <Hongbo.He@amd.com>
Acked-by: Christian König <christian.koenig@amd.com>
Acked-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_device.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 57 |
1 files 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 e4d9aa470278..3c95e1858aa2 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | |||
@@ -1872,13 +1872,40 @@ static int amdgpu_sriov_reinit_late(struct amdgpu_device *adev) | |||
1872 | return 0; | 1872 | return 0; |
1873 | } | 1873 | } |
1874 | 1874 | ||
1875 | static int amdgpu_resume(struct amdgpu_device *adev) | 1875 | static int amdgpu_resume_phase1(struct amdgpu_device *adev) |
1876 | { | 1876 | { |
1877 | int i, r; | 1877 | int i, r; |
1878 | 1878 | ||
1879 | for (i = 0; i < adev->num_ip_blocks; i++) { | 1879 | for (i = 0; i < adev->num_ip_blocks; i++) { |
1880 | if (!adev->ip_blocks[i].status.valid) | 1880 | if (!adev->ip_blocks[i].status.valid) |
1881 | continue; | 1881 | continue; |
1882 | if (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_COMMON || | ||
1883 | adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_GMC || | ||
1884 | adev->ip_blocks[i].version->type == | ||
1885 | AMD_IP_BLOCK_TYPE_IH) { | ||
1886 | r = adev->ip_blocks[i].version->funcs->resume(adev); | ||
1887 | if (r) { | ||
1888 | DRM_ERROR("resume of IP block <%s> failed %d\n", | ||
1889 | adev->ip_blocks[i].version->funcs->name, r); | ||
1890 | return r; | ||
1891 | } | ||
1892 | } | ||
1893 | } | ||
1894 | |||
1895 | return 0; | ||
1896 | } | ||
1897 | |||
1898 | static int amdgpu_resume_phase2(struct amdgpu_device *adev) | ||
1899 | { | ||
1900 | int i, r; | ||
1901 | |||
1902 | for (i = 0; i < adev->num_ip_blocks; i++) { | ||
1903 | if (!adev->ip_blocks[i].status.valid) | ||
1904 | continue; | ||
1905 | if (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_COMMON || | ||
1906 | adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_GMC || | ||
1907 | adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_IH ) | ||
1908 | continue; | ||
1882 | r = adev->ip_blocks[i].version->funcs->resume(adev); | 1909 | r = adev->ip_blocks[i].version->funcs->resume(adev); |
1883 | if (r) { | 1910 | if (r) { |
1884 | DRM_ERROR("resume of IP block <%s> failed %d\n", | 1911 | DRM_ERROR("resume of IP block <%s> failed %d\n", |
@@ -1890,6 +1917,18 @@ static int amdgpu_resume(struct amdgpu_device *adev) | |||
1890 | return 0; | 1917 | return 0; |
1891 | } | 1918 | } |
1892 | 1919 | ||
1920 | static int amdgpu_resume(struct amdgpu_device *adev) | ||
1921 | { | ||
1922 | int r; | ||
1923 | |||
1924 | r = amdgpu_resume_phase1(adev); | ||
1925 | if (r) | ||
1926 | return r; | ||
1927 | r = amdgpu_resume_phase2(adev); | ||
1928 | |||
1929 | return r; | ||
1930 | } | ||
1931 | |||
1893 | static void amdgpu_device_detect_sriov_bios(struct amdgpu_device *adev) | 1932 | static void amdgpu_device_detect_sriov_bios(struct amdgpu_device *adev) |
1894 | { | 1933 | { |
1895 | if (adev->is_atom_fw) { | 1934 | if (adev->is_atom_fw) { |
@@ -2753,16 +2792,20 @@ retry: | |||
2753 | 2792 | ||
2754 | if (!r) { | 2793 | if (!r) { |
2755 | dev_info(adev->dev, "GPU reset succeeded, trying to resume\n"); | 2794 | dev_info(adev->dev, "GPU reset succeeded, trying to resume\n"); |
2756 | r = amdgpu_resume(adev); | 2795 | r = amdgpu_resume_phase1(adev); |
2796 | if (r) | ||
2797 | goto out; | ||
2798 | r = amdgpu_ttm_recover_gart(adev); | ||
2799 | if (r) | ||
2800 | goto out; | ||
2801 | r = amdgpu_resume_phase2(adev); | ||
2802 | if (r) | ||
2803 | goto out; | ||
2757 | } | 2804 | } |
2758 | } | 2805 | } |
2806 | out: | ||
2759 | if (!r) { | 2807 | if (!r) { |
2760 | amdgpu_irq_gpu_reset_resume_helper(adev); | 2808 | amdgpu_irq_gpu_reset_resume_helper(adev); |
2761 | if (need_full_reset && amdgpu_need_backup(adev)) { | ||
2762 | r = amdgpu_ttm_recover_gart(adev); | ||
2763 | if (r) | ||
2764 | DRM_ERROR("gart recovery failed!!!\n"); | ||
2765 | } | ||
2766 | r = amdgpu_ib_ring_tests(adev); | 2809 | r = amdgpu_ib_ring_tests(adev); |
2767 | if (r) { | 2810 | if (r) { |
2768 | dev_err(adev->dev, "ib ring test failed (%d).\n", r); | 2811 | dev_err(adev->dev, "ib ring test failed (%d).\n", r); |