aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu/cik_sdma.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/cik_sdma.c')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/cik_sdma.c31
1 files changed, 16 insertions, 15 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/cik_sdma.c b/drivers/gpu/drm/amd/amdgpu/cik_sdma.c
index 15df46c93f0a..2b4242b39b0a 100644
--- a/drivers/gpu/drm/amd/amdgpu/cik_sdma.c
+++ b/drivers/gpu/drm/amd/amdgpu/cik_sdma.c
@@ -614,6 +614,7 @@ static int cik_sdma_ring_test_ib(struct amdgpu_ring *ring)
614{ 614{
615 struct amdgpu_device *adev = ring->adev; 615 struct amdgpu_device *adev = ring->adev;
616 struct amdgpu_ib ib; 616 struct amdgpu_ib ib;
617 struct fence *f = NULL;
617 unsigned i; 618 unsigned i;
618 unsigned index; 619 unsigned index;
619 int r; 620 int r;
@@ -629,12 +630,10 @@ static int cik_sdma_ring_test_ib(struct amdgpu_ring *ring)
629 gpu_addr = adev->wb.gpu_addr + (index * 4); 630 gpu_addr = adev->wb.gpu_addr + (index * 4);
630 tmp = 0xCAFEDEAD; 631 tmp = 0xCAFEDEAD;
631 adev->wb.wb[index] = cpu_to_le32(tmp); 632 adev->wb.wb[index] = cpu_to_le32(tmp);
632
633 r = amdgpu_ib_get(ring, NULL, 256, &ib); 633 r = amdgpu_ib_get(ring, NULL, 256, &ib);
634 if (r) { 634 if (r) {
635 amdgpu_wb_free(adev, index);
636 DRM_ERROR("amdgpu: failed to get ib (%d).\n", r); 635 DRM_ERROR("amdgpu: failed to get ib (%d).\n", r);
637 return r; 636 goto err0;
638 } 637 }
639 638
640 ib.ptr[0] = SDMA_PACKET(SDMA_OPCODE_WRITE, SDMA_WRITE_SUB_OPCODE_LINEAR, 0); 639 ib.ptr[0] = SDMA_PACKET(SDMA_OPCODE_WRITE, SDMA_WRITE_SUB_OPCODE_LINEAR, 0);
@@ -643,20 +642,16 @@ static int cik_sdma_ring_test_ib(struct amdgpu_ring *ring)
643 ib.ptr[3] = 1; 642 ib.ptr[3] = 1;
644 ib.ptr[4] = 0xDEADBEEF; 643 ib.ptr[4] = 0xDEADBEEF;
645 ib.length_dw = 5; 644 ib.length_dw = 5;
645 r = amdgpu_sched_ib_submit_kernel_helper(adev, ring, &ib, 1, NULL,
646 AMDGPU_FENCE_OWNER_UNDEFINED,
647 &f);
648 if (r)
649 goto err1;
646 650
647 r = amdgpu_ib_schedule(adev, 1, &ib, AMDGPU_FENCE_OWNER_UNDEFINED); 651 r = fence_wait(f, false);
648 if (r) { 652 if (r) {
649 amdgpu_ib_free(adev, &ib);
650 amdgpu_wb_free(adev, index);
651 DRM_ERROR("amdgpu: failed to schedule ib (%d).\n", r);
652 return r;
653 }
654 r = amdgpu_fence_wait(ib.fence, false);
655 if (r) {
656 amdgpu_ib_free(adev, &ib);
657 amdgpu_wb_free(adev, index);
658 DRM_ERROR("amdgpu: fence wait failed (%d).\n", r); 653 DRM_ERROR("amdgpu: fence wait failed (%d).\n", r);
659 return r; 654 goto err1;
660 } 655 }
661 for (i = 0; i < adev->usec_timeout; i++) { 656 for (i = 0; i < adev->usec_timeout; i++) {
662 tmp = le32_to_cpu(adev->wb.wb[index]); 657 tmp = le32_to_cpu(adev->wb.wb[index]);
@@ -666,12 +661,17 @@ static int cik_sdma_ring_test_ib(struct amdgpu_ring *ring)
666 } 661 }
667 if (i < adev->usec_timeout) { 662 if (i < adev->usec_timeout) {
668 DRM_INFO("ib test on ring %d succeeded in %u usecs\n", 663 DRM_INFO("ib test on ring %d succeeded in %u usecs\n",
669 ib.fence->ring->idx, i); 664 ring->idx, i);
665 goto err1;
670 } else { 666 } else {
671 DRM_ERROR("amdgpu: ib test failed (0x%08X)\n", tmp); 667 DRM_ERROR("amdgpu: ib test failed (0x%08X)\n", tmp);
672 r = -EINVAL; 668 r = -EINVAL;
673 } 669 }
670
671err1:
672 fence_put(f);
674 amdgpu_ib_free(adev, &ib); 673 amdgpu_ib_free(adev, &ib);
674err0:
675 amdgpu_wb_free(adev, index); 675 amdgpu_wb_free(adev, index);
676 return r; 676 return r;
677} 677}
@@ -1404,5 +1404,6 @@ static void cik_sdma_set_vm_pte_funcs(struct amdgpu_device *adev)
1404 if (adev->vm_manager.vm_pte_funcs == NULL) { 1404 if (adev->vm_manager.vm_pte_funcs == NULL) {
1405 adev->vm_manager.vm_pte_funcs = &cik_sdma_vm_pte_funcs; 1405 adev->vm_manager.vm_pte_funcs = &cik_sdma_vm_pte_funcs;
1406 adev->vm_manager.vm_pte_funcs_ring = &adev->sdma[0].ring; 1406 adev->vm_manager.vm_pte_funcs_ring = &adev->sdma[0].ring;
1407 adev->vm_manager.vm_pte_funcs_ring->is_pte_ring = true;
1407 } 1408 }
1408} 1409}