If the vcpu bos are allocated outside the uvd segment,
amdgpu_uvd_ring_test_ib() times out waiting on the ring's fence.

See amdgpu_fence_driver_start_ring() for more context.

Closes: https://gitlab.freedesktop.org/drm/amd/-/issues/3851
Signed-off-by: John Olender <john.olen...@gmail.com>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c | 36 ++++++++++++++-----------
 1 file changed, 21 insertions(+), 15 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
index 74758b5ffc6c..a6b3e75ffa2d 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
@@ -139,15 +139,20 @@ static void amdgpu_uvd_force_into_uvd_segment(struct 
amdgpu_bo *abo);
 
 static int amdgpu_uvd_create_msg_bo_helper(struct amdgpu_device *adev,
                                           uint32_t size,
-                                          struct amdgpu_bo **bo_ptr)
+                                          struct amdgpu_bo **bo_ptr,
+                                          bool interruptible)
 {
-       struct ttm_operation_ctx ctx = { true, false };
+       struct ttm_operation_ctx ctx = { interruptible, false };
        struct amdgpu_bo *bo = NULL;
+       u32 initial_domain = AMDGPU_GEM_DOMAIN_GTT;
        void *addr;
        int r;
 
+       if (!interruptible && adev->uvd.address_64_bit)
+               initial_domain |= AMDGPU_GEM_DOMAIN_VRAM;
+
        r = amdgpu_bo_create_reserved(adev, size, PAGE_SIZE,
-                                     AMDGPU_GEM_DOMAIN_GTT,
+                                     initial_domain,
                                      &bo, NULL, &addr);
        if (r)
                return r;
@@ -319,19 +324,23 @@ int amdgpu_uvd_sw_init(struct amdgpu_device *adev)
        if (adev->firmware.load_type != AMDGPU_FW_LOAD_PSP)
                bo_size += 
AMDGPU_GPU_PAGE_ALIGN(le32_to_cpu(hdr->ucode_size_bytes) + 8);
 
+       /* from uvd v5.0 HW addressing capacity increased to 64 bits */
+       if (!amdgpu_device_ip_block_version_cmp(adev, AMD_IP_BLOCK_TYPE_UVD, 5, 
0))
+               adev->uvd.address_64_bit = true;
+
        for (j = 0; j < adev->uvd.num_uvd_inst; j++) {
                if (adev->uvd.harvest_config & (1 << j))
                        continue;
-               r = amdgpu_bo_create_kernel(adev, bo_size, PAGE_SIZE,
-                                           AMDGPU_GEM_DOMAIN_VRAM |
-                                           AMDGPU_GEM_DOMAIN_GTT,
-                                           &adev->uvd.inst[j].vcpu_bo,
-                                           &adev->uvd.inst[j].gpu_addr,
-                                           &adev->uvd.inst[j].cpu_addr);
+               r = amdgpu_uvd_create_msg_bo_helper(adev, bo_size,
+                               &adev->uvd.inst[j].vcpu_bo, false);
                if (r) {
                        dev_err(adev->dev, "(%d) failed to allocate UVD bo\n", 
r);
                        return r;
                }
+               adev->uvd.inst[j].gpu_addr =
+                               amdgpu_bo_gpu_offset(adev->uvd.inst[j].vcpu_bo);
+               adev->uvd.inst[j].cpu_addr =
+                               amdgpu_bo_kptr(adev->uvd.inst[j].vcpu_bo);
        }
 
        for (i = 0; i < adev->uvd.max_handles; ++i) {
@@ -339,11 +348,8 @@ int amdgpu_uvd_sw_init(struct amdgpu_device *adev)
                adev->uvd.filp[i] = NULL;
        }
 
-       /* from uvd v5.0 HW addressing capacity increased to 64 bits */
-       if (!amdgpu_device_ip_block_version_cmp(adev, AMD_IP_BLOCK_TYPE_UVD, 5, 
0))
-               adev->uvd.address_64_bit = true;
-
-       r = amdgpu_uvd_create_msg_bo_helper(adev, 128 << 10, &adev->uvd.ib_bo);
+       r = amdgpu_uvd_create_msg_bo_helper(adev, 128 << 10, &adev->uvd.ib_bo,
+                       true);
        if (r)
                return r;
 
@@ -1236,7 +1242,7 @@ int amdgpu_uvd_get_destroy_msg(struct amdgpu_ring *ring, 
uint32_t handle,
        if (direct) {
                bo = adev->uvd.ib_bo;
        } else {
-               r = amdgpu_uvd_create_msg_bo_helper(adev, 4096, &bo);
+               r = amdgpu_uvd_create_msg_bo_helper(adev, 4096, &bo, true);
                if (r)
                        return r;
        }
-- 
2.47.2

Reply via email to