diff options
author | Christian König <christian.koenig@amd.com> | 2016-07-05 15:07:17 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2016-07-29 14:37:04 -0400 |
commit | bbec97aae660adafa5208c5defc54e3cbbe6b129 (patch) | |
tree | deb3ede843224998cbb28f895b6f26828583770d | |
parent | 8de190c9f44204810440e26ac09913a1fa40aa36 (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.h | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c | 25 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.h | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c | 18 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/cik_sdma.c | 19 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c | 19 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c | 19 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c | 19 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c | 19 |
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 | */ |
1138 | int amdgpu_uvd_ring_test_ib(struct amdgpu_ring *ring) | 1138 | int 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 | |
1161 | error: | 1166 | error: |
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, | |||
37 | int amdgpu_uvd_ring_parse_cs(struct amdgpu_cs_parser *parser, uint32_t ib_idx); | 37 | int amdgpu_uvd_ring_parse_cs(struct amdgpu_cs_parser *parser, uint32_t ib_idx); |
38 | void amdgpu_uvd_ring_begin_use(struct amdgpu_ring *ring); | 38 | void amdgpu_uvd_ring_begin_use(struct amdgpu_ring *ring); |
39 | void amdgpu_uvd_ring_end_use(struct amdgpu_ring *ring); | 39 | void amdgpu_uvd_ring_end_use(struct amdgpu_ring *ring); |
40 | int amdgpu_uvd_ring_test_ib(struct amdgpu_ring *ring); | 40 | int 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 | */ |
847 | int amdgpu_vce_ring_test_ib(struct amdgpu_ring *ring) | 847 | int 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 | } |
874 | error: | 878 | error: |
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, | |||
39 | void amdgpu_vce_ring_emit_fence(struct amdgpu_ring *ring, u64 addr, u64 seq, | 39 | void amdgpu_vce_ring_emit_fence(struct amdgpu_ring *ring, u64 addr, u64 seq, |
40 | unsigned flags); | 40 | unsigned flags); |
41 | int amdgpu_vce_ring_test_ring(struct amdgpu_ring *ring); | 41 | int amdgpu_vce_ring_test_ring(struct amdgpu_ring *ring); |
42 | int amdgpu_vce_ring_test_ib(struct amdgpu_ring *ring); | 42 | int amdgpu_vce_ring_test_ib(struct amdgpu_ring *ring, long timeout); |
43 | void amdgpu_vce_ring_begin_use(struct amdgpu_ring *ring); | 43 | void amdgpu_vce_ring_begin_use(struct amdgpu_ring *ring); |
44 | void amdgpu_vce_ring_end_use(struct amdgpu_ring *ring); | 44 | void 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 | */ |
620 | static int cik_sdma_ring_test_ib(struct amdgpu_ring *ring) | 620 | static 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 | */ |
2108 | static int gfx_v7_0_ring_test_ib(struct amdgpu_ring *ring) | 2108 | static 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 | ||
790 | static int gfx_v8_0_ring_test_ib(struct amdgpu_ring *ring) | 790 | static 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 | */ |
671 | static int sdma_v2_4_ring_test_ib(struct amdgpu_ring *ring) | 671 | static 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 | */ |
899 | static int sdma_v3_0_ring_test_ib(struct amdgpu_ring *ring) | 899 | static 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; |