diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/cik_sdma.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/cik_sdma.c | 31 |
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 | |||
671 | err1: | ||
672 | fence_put(f); | ||
674 | amdgpu_ib_free(adev, &ib); | 673 | amdgpu_ib_free(adev, &ib); |
674 | err0: | ||
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 | } |