aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian König <christian.koenig@amd.com>2016-07-05 15:07:17 -0400
committerAlex Deucher <alexander.deucher@amd.com>2016-07-29 14:37:04 -0400
commitbbec97aae660adafa5208c5defc54e3cbbe6b129 (patch)
treedeb3ede843224998cbb28f895b6f26828583770d
parent8de190c9f44204810440e26ac09913a1fa40aa36 (diff)
drm/amdgpu: add a fence timeout for the IB tests v2
10ms should be enough for now. v2: fix some typos in CIK code Signed-off-by: Christian König <christian.koenig@amd.com> Reviewed-by: Chunming Zhou <david1.zhou@amd.com> Reviewed-by: Edward O'Callaghan <funfunctor@folklore1984.net> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu.h4
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c4
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c25
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.h2
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c18
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h2
-rw-r--r--drivers/gpu/drm/amd/amdgpu/cik_sdma.c19
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c19
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c19
-rw-r--r--drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c19
-rw-r--r--drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c19
11 files changed, 93 insertions, 57 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
index 02a0d19ce54c..9d1909f08d43 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
@@ -306,7 +306,7 @@ struct amdgpu_ring_funcs {
306 uint32_t oa_base, uint32_t oa_size); 306 uint32_t oa_base, uint32_t oa_size);
307 /* testing functions */ 307 /* testing functions */
308 int (*test_ring)(struct amdgpu_ring *ring); 308 int (*test_ring)(struct amdgpu_ring *ring);
309 int (*test_ib)(struct amdgpu_ring *ring); 309 int (*test_ib)(struct amdgpu_ring *ring, long timeout);
310 /* insert NOP packets */ 310 /* insert NOP packets */
311 void (*insert_nop)(struct amdgpu_ring *ring, uint32_t count); 311 void (*insert_nop)(struct amdgpu_ring *ring, uint32_t count);
312 /* pad the indirect buffer to the necessary number of dw */ 312 /* pad the indirect buffer to the necessary number of dw */
@@ -2245,7 +2245,7 @@ amdgpu_get_sdma_instance(struct amdgpu_ring *ring)
2245#define amdgpu_vm_set_pte_pde(adev, ib, pe, addr, count, incr, flags) ((adev)->vm_manager.vm_pte_funcs->set_pte_pde((ib), (pe), (addr), (count), (incr), (flags))) 2245#define amdgpu_vm_set_pte_pde(adev, ib, pe, addr, count, incr, flags) ((adev)->vm_manager.vm_pte_funcs->set_pte_pde((ib), (pe), (addr), (count), (incr), (flags)))
2246#define amdgpu_ring_parse_cs(r, p, ib) ((r)->funcs->parse_cs((p), (ib))) 2246#define amdgpu_ring_parse_cs(r, p, ib) ((r)->funcs->parse_cs((p), (ib)))
2247#define amdgpu_ring_test_ring(r) (r)->funcs->test_ring((r)) 2247#define amdgpu_ring_test_ring(r) (r)->funcs->test_ring((r))
2248#define amdgpu_ring_test_ib(r) (r)->funcs->test_ib((r)) 2248#define amdgpu_ring_test_ib(r, t) (r)->funcs->test_ib((r), (t))
2249#define amdgpu_ring_get_rptr(r) (r)->funcs->get_rptr((r)) 2249#define amdgpu_ring_get_rptr(r) (r)->funcs->get_rptr((r))
2250#define amdgpu_ring_get_wptr(r) (r)->funcs->get_wptr((r)) 2250#define amdgpu_ring_get_wptr(r) (r)->funcs->get_wptr((r))
2251#define amdgpu_ring_set_wptr(r) (r)->funcs->set_wptr((r)) 2251#define amdgpu_ring_set_wptr(r) (r)->funcs->set_wptr((r))
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c
index 428ebf3a4387..050062e07a44 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c
@@ -33,6 +33,8 @@
33#include "amdgpu.h" 33#include "amdgpu.h"
34#include "atom.h" 34#include "atom.h"
35 35
36#define AMDGPU_IB_TEST_TIMEOUT msecs_to_jiffies(10)
37
36/* 38/*
37 * IB 39 * IB
38 * IBs (Indirect Buffers) and areas of GPU accessible memory where 40 * IBs (Indirect Buffers) and areas of GPU accessible memory where
@@ -286,7 +288,7 @@ int amdgpu_ib_ring_tests(struct amdgpu_device *adev)
286 if (!ring || !ring->ready) 288 if (!ring || !ring->ready)
287 continue; 289 continue;
288 290
289 r = amdgpu_ring_test_ib(ring); 291 r = amdgpu_ring_test_ib(ring, AMDGPU_IB_TEST_TIMEOUT);
290 if (r) { 292 if (r) {
291 ring->ready = false; 293 ring->ready = false;
292 294
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
index ef5342bd6968..c3712498c2c2 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
@@ -1135,29 +1135,34 @@ void amdgpu_uvd_ring_end_use(struct amdgpu_ring *ring)
1135 * 1135 *
1136 * Test if we can successfully execute an IB 1136 * Test if we can successfully execute an IB
1137 */ 1137 */
1138int amdgpu_uvd_ring_test_ib(struct amdgpu_ring *ring) 1138int amdgpu_uvd_ring_test_ib(struct amdgpu_ring *ring, long timeout)
1139{ 1139{
1140 struct fence *fence = NULL; 1140 struct fence *fence;
1141 int r; 1141 long r;
1142 1142
1143 r = amdgpu_uvd_get_create_msg(ring, 1, NULL); 1143 r = amdgpu_uvd_get_create_msg(ring, 1, NULL);
1144 if (r) { 1144 if (r) {
1145 DRM_ERROR("amdgpu: failed to get create msg (%d).\n", r); 1145 DRM_ERROR("amdgpu: failed to get create msg (%ld).\n", r);
1146 goto error; 1146 goto error;
1147 } 1147 }
1148 1148
1149 r = amdgpu_uvd_get_destroy_msg(ring, 1, true, &fence); 1149 r = amdgpu_uvd_get_destroy_msg(ring, 1, true, &fence);
1150 if (r) { 1150 if (r) {
1151 DRM_ERROR("amdgpu: failed to get destroy ib (%d).\n", r); 1151 DRM_ERROR("amdgpu: failed to get destroy ib (%ld).\n", r);
1152 goto error; 1152 goto error;
1153 } 1153 }
1154 1154
1155 r = fence_wait(fence, false); 1155 r = fence_wait_timeout(fence, false, timeout);
1156 if (r) { 1156 if (r == 0) {
1157 DRM_ERROR("amdgpu: fence wait failed (%d).\n", r); 1157 DRM_ERROR("amdgpu: IB test timed out.\n");
1158 goto error; 1158 r = -ETIMEDOUT;
1159 } else if (r < 0) {
1160 DRM_ERROR("amdgpu: fence wait failed (%ld).\n", r);
1161 } else {
1162 DRM_INFO("ib test on ring %d succeeded\n", ring->idx);
1163 r = 0;
1159 } 1164 }
1160 DRM_INFO("ib test on ring %d succeeded\n", ring->idx); 1165
1161error: 1166error:
1162 fence_put(fence); 1167 fence_put(fence);
1163 return r; 1168 return r;
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.h
index 224359e4d0b4..c850009602d1 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.h
@@ -37,6 +37,6 @@ void amdgpu_uvd_free_handles(struct amdgpu_device *adev,
37int amdgpu_uvd_ring_parse_cs(struct amdgpu_cs_parser *parser, uint32_t ib_idx); 37int amdgpu_uvd_ring_parse_cs(struct amdgpu_cs_parser *parser, uint32_t ib_idx);
38void amdgpu_uvd_ring_begin_use(struct amdgpu_ring *ring); 38void amdgpu_uvd_ring_begin_use(struct amdgpu_ring *ring);
39void amdgpu_uvd_ring_end_use(struct amdgpu_ring *ring); 39void amdgpu_uvd_ring_end_use(struct amdgpu_ring *ring);
40int amdgpu_uvd_ring_test_ib(struct amdgpu_ring *ring); 40int amdgpu_uvd_ring_test_ib(struct amdgpu_ring *ring, long timeout);
41 41
42#endif 42#endif
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
index 6b49d406daf6..0afa73c82a9f 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
@@ -844,10 +844,10 @@ int amdgpu_vce_ring_test_ring(struct amdgpu_ring *ring)
844 * @ring: the engine to test on 844 * @ring: the engine to test on
845 * 845 *
846 */ 846 */
847int amdgpu_vce_ring_test_ib(struct amdgpu_ring *ring) 847int amdgpu_vce_ring_test_ib(struct amdgpu_ring *ring, long timeout)
848{ 848{
849 struct fence *fence = NULL; 849 struct fence *fence = NULL;
850 int r; 850 long r;
851 851
852 /* skip vce ring1 ib test for now, since it's not reliable */ 852 /* skip vce ring1 ib test for now, since it's not reliable */
853 if (ring == &ring->adev->vce.ring[1]) 853 if (ring == &ring->adev->vce.ring[1])
@@ -855,21 +855,25 @@ int amdgpu_vce_ring_test_ib(struct amdgpu_ring *ring)
855 855
856 r = amdgpu_vce_get_create_msg(ring, 1, NULL); 856 r = amdgpu_vce_get_create_msg(ring, 1, NULL);
857 if (r) { 857 if (r) {
858 DRM_ERROR("amdgpu: failed to get create msg (%d).\n", r); 858 DRM_ERROR("amdgpu: failed to get create msg (%ld).\n", r);
859 goto error; 859 goto error;
860 } 860 }
861 861
862 r = amdgpu_vce_get_destroy_msg(ring, 1, true, &fence); 862 r = amdgpu_vce_get_destroy_msg(ring, 1, true, &fence);
863 if (r) { 863 if (r) {
864 DRM_ERROR("amdgpu: failed to get destroy ib (%d).\n", r); 864 DRM_ERROR("amdgpu: failed to get destroy ib (%ld).\n", r);
865 goto error; 865 goto error;
866 } 866 }
867 867
868 r = fence_wait(fence, false); 868 r = fence_wait_timeout(fence, false, timeout);
869 if (r) { 869 if (r == 0) {
870 DRM_ERROR("amdgpu: fence wait failed (%d).\n", r); 870 DRM_ERROR("amdgpu: IB test timed out.\n");
871 r = -ETIMEDOUT;
872 } else if (r < 0) {
873 DRM_ERROR("amdgpu: fence wait failed (%ld).\n", r);
871 } else { 874 } else {
872 DRM_INFO("ib test on ring %d succeeded\n", ring->idx); 875 DRM_INFO("ib test on ring %d succeeded\n", ring->idx);
876 r = 0;
873 } 877 }
874error: 878error:
875 fence_put(fence); 879 fence_put(fence);
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h
index fe84b80dbbed..63f83d0d985c 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h
@@ -39,7 +39,7 @@ void amdgpu_vce_ring_emit_ib(struct amdgpu_ring *ring, struct amdgpu_ib *ib,
39void amdgpu_vce_ring_emit_fence(struct amdgpu_ring *ring, u64 addr, u64 seq, 39void amdgpu_vce_ring_emit_fence(struct amdgpu_ring *ring, u64 addr, u64 seq,
40 unsigned flags); 40 unsigned flags);
41int amdgpu_vce_ring_test_ring(struct amdgpu_ring *ring); 41int amdgpu_vce_ring_test_ring(struct amdgpu_ring *ring);
42int amdgpu_vce_ring_test_ib(struct amdgpu_ring *ring); 42int amdgpu_vce_ring_test_ib(struct amdgpu_ring *ring, long timeout);
43void amdgpu_vce_ring_begin_use(struct amdgpu_ring *ring); 43void amdgpu_vce_ring_begin_use(struct amdgpu_ring *ring);
44void amdgpu_vce_ring_end_use(struct amdgpu_ring *ring); 44void amdgpu_vce_ring_end_use(struct amdgpu_ring *ring);
45 45
diff --git a/drivers/gpu/drm/amd/amdgpu/cik_sdma.c b/drivers/gpu/drm/amd/amdgpu/cik_sdma.c
index c1eedc466526..ee6466912497 100644
--- a/drivers/gpu/drm/amd/amdgpu/cik_sdma.c
+++ b/drivers/gpu/drm/amd/amdgpu/cik_sdma.c
@@ -617,19 +617,19 @@ static int cik_sdma_ring_test_ring(struct amdgpu_ring *ring)
617 * Test a simple IB in the DMA ring (CIK). 617 * Test a simple IB in the DMA ring (CIK).
618 * Returns 0 on success, error on failure. 618 * Returns 0 on success, error on failure.
619 */ 619 */
620static int cik_sdma_ring_test_ib(struct amdgpu_ring *ring) 620static int cik_sdma_ring_test_ib(struct amdgpu_ring *ring, long timeout)
621{ 621{
622 struct amdgpu_device *adev = ring->adev; 622 struct amdgpu_device *adev = ring->adev;
623 struct amdgpu_ib ib; 623 struct amdgpu_ib ib;
624 struct fence *f = NULL; 624 struct fence *f = NULL;
625 unsigned index; 625 unsigned index;
626 int r;
627 u32 tmp = 0; 626 u32 tmp = 0;
628 u64 gpu_addr; 627 u64 gpu_addr;
628 long r;
629 629
630 r = amdgpu_wb_get(adev, &index); 630 r = amdgpu_wb_get(adev, &index);
631 if (r) { 631 if (r) {
632 dev_err(adev->dev, "(%d) failed to allocate wb slot\n", r); 632 dev_err(adev->dev, "(%ld) failed to allocate wb slot\n", r);
633 return r; 633 return r;
634 } 634 }
635 635
@@ -639,7 +639,7 @@ static int cik_sdma_ring_test_ib(struct amdgpu_ring *ring)
639 memset(&ib, 0, sizeof(ib)); 639 memset(&ib, 0, sizeof(ib));
640 r = amdgpu_ib_get(adev, NULL, 256, &ib); 640 r = amdgpu_ib_get(adev, NULL, 256, &ib);
641 if (r) { 641 if (r) {
642 DRM_ERROR("amdgpu: failed to get ib (%d).\n", r); 642 DRM_ERROR("amdgpu: failed to get ib (%ld).\n", r);
643 goto err0; 643 goto err0;
644 } 644 }
645 645
@@ -654,14 +654,19 @@ static int cik_sdma_ring_test_ib(struct amdgpu_ring *ring)
654 if (r) 654 if (r)
655 goto err1; 655 goto err1;
656 656
657 r = fence_wait(f, false); 657 r = fence_wait_timeout(f, false, timeout);
658 if (r) { 658 if (r == 0) {
659 DRM_ERROR("amdgpu: fence wait failed (%d).\n", r); 659 DRM_ERROR("amdgpu: IB test timed out\n");
660 r = -ETIMEDOUT;
661 goto err1;
662 } else if (r < 0) {
663 DRM_ERROR("amdgpu: fence wait failed (%ld).\n", r);
660 goto err1; 664 goto err1;
661 } 665 }
662 tmp = le32_to_cpu(adev->wb.wb[index]); 666 tmp = le32_to_cpu(adev->wb.wb[index]);
663 if (tmp == 0xDEADBEEF) { 667 if (tmp == 0xDEADBEEF) {
664 DRM_INFO("ib test on ring %d succeeded\n", ring->idx); 668 DRM_INFO("ib test on ring %d succeeded\n", ring->idx);
669 r = 0;
665 } else { 670 } else {
666 DRM_ERROR("amdgpu: ib test failed (0x%08X)\n", tmp); 671 DRM_ERROR("amdgpu: ib test failed (0x%08X)\n", tmp);
667 r = -EINVAL; 672 r = -EINVAL;
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c
index 1ac5ad01bf58..d869d058ef24 100644
--- a/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c
@@ -2105,25 +2105,25 @@ static void gfx_v7_0_ring_emit_ib_compute(struct amdgpu_ring *ring,
2105 * Provides a basic gfx ring test to verify that IBs are working. 2105 * Provides a basic gfx ring test to verify that IBs are working.
2106 * Returns 0 on success, error on failure. 2106 * Returns 0 on success, error on failure.
2107 */ 2107 */
2108static int gfx_v7_0_ring_test_ib(struct amdgpu_ring *ring) 2108static int gfx_v7_0_ring_test_ib(struct amdgpu_ring *ring, long timeout)
2109{ 2109{
2110 struct amdgpu_device *adev = ring->adev; 2110 struct amdgpu_device *adev = ring->adev;
2111 struct amdgpu_ib ib; 2111 struct amdgpu_ib ib;
2112 struct fence *f = NULL; 2112 struct fence *f = NULL;
2113 uint32_t scratch; 2113 uint32_t scratch;
2114 uint32_t tmp = 0; 2114 uint32_t tmp = 0;
2115 int r; 2115 long r;
2116 2116
2117 r = amdgpu_gfx_scratch_get(adev, &scratch); 2117 r = amdgpu_gfx_scratch_get(adev, &scratch);
2118 if (r) { 2118 if (r) {
2119 DRM_ERROR("amdgpu: failed to get scratch reg (%d).\n", r); 2119 DRM_ERROR("amdgpu: failed to get scratch reg (%ld).\n", r);
2120 return r; 2120 return r;
2121 } 2121 }
2122 WREG32(scratch, 0xCAFEDEAD); 2122 WREG32(scratch, 0xCAFEDEAD);
2123 memset(&ib, 0, sizeof(ib)); 2123 memset(&ib, 0, sizeof(ib));
2124 r = amdgpu_ib_get(adev, NULL, 256, &ib); 2124 r = amdgpu_ib_get(adev, NULL, 256, &ib);
2125 if (r) { 2125 if (r) {
2126 DRM_ERROR("amdgpu: failed to get ib (%d).\n", r); 2126 DRM_ERROR("amdgpu: failed to get ib (%ld).\n", r);
2127 goto err1; 2127 goto err1;
2128 } 2128 }
2129 ib.ptr[0] = PACKET3(PACKET3_SET_UCONFIG_REG, 1); 2129 ib.ptr[0] = PACKET3(PACKET3_SET_UCONFIG_REG, 1);
@@ -2135,14 +2135,19 @@ static int gfx_v7_0_ring_test_ib(struct amdgpu_ring *ring)
2135 if (r) 2135 if (r)
2136 goto err2; 2136 goto err2;
2137 2137
2138 r = fence_wait(f, false); 2138 r = fence_wait_timeout(f, false, timeout);
2139 if (r) { 2139 if (r == 0) {
2140 DRM_ERROR("amdgpu: fence wait failed (%d).\n", r); 2140 DRM_ERROR("amdgpu: IB test timed out\n");
2141 r = -ETIMEDOUT;
2142 goto err2;
2143 } else if (r < 0) {
2144 DRM_ERROR("amdgpu: fence wait failed (%ld).\n", r);
2141 goto err2; 2145 goto err2;
2142 } 2146 }
2143 tmp = RREG32(scratch); 2147 tmp = RREG32(scratch);
2144 if (tmp == 0xDEADBEEF) { 2148 if (tmp == 0xDEADBEEF) {
2145 DRM_INFO("ib test on ring %d succeeded\n", ring->idx); 2149 DRM_INFO("ib test on ring %d succeeded\n", ring->idx);
2150 r = 0;
2146 } else { 2151 } else {
2147 DRM_ERROR("amdgpu: ib test failed (scratch(0x%04X)=0x%08X)\n", 2152 DRM_ERROR("amdgpu: ib test failed (scratch(0x%04X)=0x%08X)\n",
2148 scratch, tmp); 2153 scratch, tmp);
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
index d97b962bc3de..bff8668e9e6d 100644
--- a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
@@ -787,25 +787,25 @@ static int gfx_v8_0_ring_test_ring(struct amdgpu_ring *ring)
787 return r; 787 return r;
788} 788}
789 789
790static int gfx_v8_0_ring_test_ib(struct amdgpu_ring *ring) 790static int gfx_v8_0_ring_test_ib(struct amdgpu_ring *ring, long timeout)
791{ 791{
792 struct amdgpu_device *adev = ring->adev; 792 struct amdgpu_device *adev = ring->adev;
793 struct amdgpu_ib ib; 793 struct amdgpu_ib ib;
794 struct fence *f = NULL; 794 struct fence *f = NULL;
795 uint32_t scratch; 795 uint32_t scratch;
796 uint32_t tmp = 0; 796 uint32_t tmp = 0;
797 int r; 797 long r;
798 798
799 r = amdgpu_gfx_scratch_get(adev, &scratch); 799 r = amdgpu_gfx_scratch_get(adev, &scratch);
800 if (r) { 800 if (r) {
801 DRM_ERROR("amdgpu: failed to get scratch reg (%d).\n", r); 801 DRM_ERROR("amdgpu: failed to get scratch reg (%ld).\n", r);
802 return r; 802 return r;
803 } 803 }
804 WREG32(scratch, 0xCAFEDEAD); 804 WREG32(scratch, 0xCAFEDEAD);
805 memset(&ib, 0, sizeof(ib)); 805 memset(&ib, 0, sizeof(ib));
806 r = amdgpu_ib_get(adev, NULL, 256, &ib); 806 r = amdgpu_ib_get(adev, NULL, 256, &ib);
807 if (r) { 807 if (r) {
808 DRM_ERROR("amdgpu: failed to get ib (%d).\n", r); 808 DRM_ERROR("amdgpu: failed to get ib (%ld).\n", r);
809 goto err1; 809 goto err1;
810 } 810 }
811 ib.ptr[0] = PACKET3(PACKET3_SET_UCONFIG_REG, 1); 811 ib.ptr[0] = PACKET3(PACKET3_SET_UCONFIG_REG, 1);
@@ -817,14 +817,19 @@ static int gfx_v8_0_ring_test_ib(struct amdgpu_ring *ring)
817 if (r) 817 if (r)
818 goto err2; 818 goto err2;
819 819
820 r = fence_wait(f, false); 820 r = fence_wait_timeout(f, false, timeout);
821 if (r) { 821 if (r == 0) {
822 DRM_ERROR("amdgpu: fence wait failed (%d).\n", r); 822 DRM_ERROR("amdgpu: IB test timed out.\n");
823 r = -ETIMEDOUT;
824 goto err2;
825 } else if (r < 0) {
826 DRM_ERROR("amdgpu: fence wait failed (%ld).\n", r);
823 goto err2; 827 goto err2;
824 } 828 }
825 tmp = RREG32(scratch); 829 tmp = RREG32(scratch);
826 if (tmp == 0xDEADBEEF) { 830 if (tmp == 0xDEADBEEF) {
827 DRM_INFO("ib test on ring %d succeeded\n", ring->idx); 831 DRM_INFO("ib test on ring %d succeeded\n", ring->idx);
832 r = 0;
828 } else { 833 } else {
829 DRM_ERROR("amdgpu: ib test failed (scratch(0x%04X)=0x%08X)\n", 834 DRM_ERROR("amdgpu: ib test failed (scratch(0x%04X)=0x%08X)\n",
830 scratch, tmp); 835 scratch, tmp);
diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c b/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c
index 9d43c6ca37e6..1351c7e834a2 100644
--- a/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c
+++ b/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c
@@ -668,19 +668,19 @@ static int sdma_v2_4_ring_test_ring(struct amdgpu_ring *ring)
668 * Test a simple IB in the DMA ring (VI). 668 * Test a simple IB in the DMA ring (VI).
669 * Returns 0 on success, error on failure. 669 * Returns 0 on success, error on failure.
670 */ 670 */
671static int sdma_v2_4_ring_test_ib(struct amdgpu_ring *ring) 671static int sdma_v2_4_ring_test_ib(struct amdgpu_ring *ring, long timeout)
672{ 672{
673 struct amdgpu_device *adev = ring->adev; 673 struct amdgpu_device *adev = ring->adev;
674 struct amdgpu_ib ib; 674 struct amdgpu_ib ib;
675 struct fence *f = NULL; 675 struct fence *f = NULL;
676 unsigned index; 676 unsigned index;
677 int r;
678 u32 tmp = 0; 677 u32 tmp = 0;
679 u64 gpu_addr; 678 u64 gpu_addr;
679 long r;
680 680
681 r = amdgpu_wb_get(adev, &index); 681 r = amdgpu_wb_get(adev, &index);
682 if (r) { 682 if (r) {
683 dev_err(adev->dev, "(%d) failed to allocate wb slot\n", r); 683 dev_err(adev->dev, "(%ld) failed to allocate wb slot\n", r);
684 return r; 684 return r;
685 } 685 }
686 686
@@ -690,7 +690,7 @@ static int sdma_v2_4_ring_test_ib(struct amdgpu_ring *ring)
690 memset(&ib, 0, sizeof(ib)); 690 memset(&ib, 0, sizeof(ib));
691 r = amdgpu_ib_get(adev, NULL, 256, &ib); 691 r = amdgpu_ib_get(adev, NULL, 256, &ib);
692 if (r) { 692 if (r) {
693 DRM_ERROR("amdgpu: failed to get ib (%d).\n", r); 693 DRM_ERROR("amdgpu: failed to get ib (%ld).\n", r);
694 goto err0; 694 goto err0;
695 } 695 }
696 696
@@ -709,14 +709,19 @@ static int sdma_v2_4_ring_test_ib(struct amdgpu_ring *ring)
709 if (r) 709 if (r)
710 goto err1; 710 goto err1;
711 711
712 r = fence_wait(f, false); 712 r = fence_wait_timeout(f, false, timeout);
713 if (r) { 713 if (r == 0) {
714 DRM_ERROR("amdgpu: fence wait failed (%d).\n", r); 714 DRM_ERROR("amdgpu: IB test timed out\n");
715 r = -ETIMEDOUT;
716 goto err1;
717 } else if (r) {
718 DRM_ERROR("amdgpu: fence wait failed (%ld).\n", r);
715 goto err1; 719 goto err1;
716 } 720 }
717 tmp = le32_to_cpu(adev->wb.wb[index]); 721 tmp = le32_to_cpu(adev->wb.wb[index]);
718 if (tmp == 0xDEADBEEF) { 722 if (tmp == 0xDEADBEEF) {
719 DRM_INFO("ib test on ring %d succeeded\n", ring->idx); 723 DRM_INFO("ib test on ring %d succeeded\n", ring->idx);
724 r = 0;
720 } else { 725 } else {
721 DRM_ERROR("amdgpu: ib test failed (0x%08X)\n", tmp); 726 DRM_ERROR("amdgpu: ib test failed (0x%08X)\n", tmp);
722 r = -EINVAL; 727 r = -EINVAL;
diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c b/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
index 4debd0dc47d8..653ce5ed55ae 100644
--- a/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
@@ -896,19 +896,19 @@ static int sdma_v3_0_ring_test_ring(struct amdgpu_ring *ring)
896 * Test a simple IB in the DMA ring (VI). 896 * Test a simple IB in the DMA ring (VI).
897 * Returns 0 on success, error on failure. 897 * Returns 0 on success, error on failure.
898 */ 898 */
899static int sdma_v3_0_ring_test_ib(struct amdgpu_ring *ring) 899static int sdma_v3_0_ring_test_ib(struct amdgpu_ring *ring, long timeout)
900{ 900{
901 struct amdgpu_device *adev = ring->adev; 901 struct amdgpu_device *adev = ring->adev;
902 struct amdgpu_ib ib; 902 struct amdgpu_ib ib;
903 struct fence *f = NULL; 903 struct fence *f = NULL;
904 unsigned index; 904 unsigned index;
905 int r;
906 u32 tmp = 0; 905 u32 tmp = 0;
907 u64 gpu_addr; 906 u64 gpu_addr;
907 long r;
908 908
909 r = amdgpu_wb_get(adev, &index); 909 r = amdgpu_wb_get(adev, &index);
910 if (r) { 910 if (r) {
911 dev_err(adev->dev, "(%d) failed to allocate wb slot\n", r); 911 dev_err(adev->dev, "(%ld) failed to allocate wb slot\n", r);
912 return r; 912 return r;
913 } 913 }
914 914
@@ -918,7 +918,7 @@ static int sdma_v3_0_ring_test_ib(struct amdgpu_ring *ring)
918 memset(&ib, 0, sizeof(ib)); 918 memset(&ib, 0, sizeof(ib));
919 r = amdgpu_ib_get(adev, NULL, 256, &ib); 919 r = amdgpu_ib_get(adev, NULL, 256, &ib);
920 if (r) { 920 if (r) {
921 DRM_ERROR("amdgpu: failed to get ib (%d).\n", r); 921 DRM_ERROR("amdgpu: failed to get ib (%ld).\n", r);
922 goto err0; 922 goto err0;
923 } 923 }
924 924
@@ -937,14 +937,19 @@ static int sdma_v3_0_ring_test_ib(struct amdgpu_ring *ring)
937 if (r) 937 if (r)
938 goto err1; 938 goto err1;
939 939
940 r = fence_wait(f, false); 940 r = fence_wait_timeout(f, false, timeout);
941 if (r) { 941 if (r == 0) {
942 DRM_ERROR("amdgpu: fence wait failed (%d).\n", r); 942 DRM_ERROR("amdgpu: IB test timed out\n");
943 r = -ETIMEDOUT;
944 goto err1;
945 } else if (r < 0) {
946 DRM_ERROR("amdgpu: fence wait failed (%ld).\n", r);
943 goto err1; 947 goto err1;
944 } 948 }
945 tmp = le32_to_cpu(adev->wb.wb[index]); 949 tmp = le32_to_cpu(adev->wb.wb[index]);
946 if (tmp == 0xDEADBEEF) { 950 if (tmp == 0xDEADBEEF) {
947 DRM_INFO("ib test on ring %d succeeded\n", ring->idx); 951 DRM_INFO("ib test on ring %d succeeded\n", ring->idx);
952 r = 0;
948 } else { 953 } else {
949 DRM_ERROR("amdgpu: ib test failed (0x%08X)\n", tmp); 954 DRM_ERROR("amdgpu: ib test failed (0x%08X)\n", tmp);
950 r = -EINVAL; 955 r = -EINVAL;