VCE 1 and 2 always output feedback, same as for create message
we must provide a valid buffer.

Signed-off-by: David Rosca <[email protected]>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c | 21 ++++++++++++++++++++-
 1 file changed, 20 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
index 1f7a98cdce5a..39d87f3df9e0 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
@@ -558,7 +558,9 @@ static int amdgpu_vce_get_destroy_msg(struct amdgpu_ring 
*ring, uint32_t handle,
        const unsigned int ib_size_dw = 1024;
        struct amdgpu_job *job;
        struct amdgpu_ib *ib;
+       struct amdgpu_ib ib_msg;
        struct dma_fence *f = NULL;
+       uint64_t addr;
        int i, r;
 
        r = amdgpu_job_alloc_with_ib(ring->adev, &ring->adev->vce.entity,
@@ -571,7 +573,17 @@ static int amdgpu_vce_get_destroy_msg(struct amdgpu_ring 
*ring, uint32_t handle,
        if (r)
                return r;
 
+       memset(&ib_msg, 0, sizeof(ib_msg));
+       /* only one gpu page is needed, alloc +1 page to make addr aligned. */
+       r = amdgpu_ib_get(ring->adev, NULL, AMDGPU_GPU_PAGE_SIZE * 2,
+                         direct ? AMDGPU_IB_POOL_DIRECT : 
AMDGPU_IB_POOL_DELAYED,
+                         &ib_msg);
+       if (r)
+               goto err;
+
        ib = &job->ibs[0];
+       /* let addr point to page boundary */
+       addr = AMDGPU_GPU_PAGE_ALIGN(ib_msg.gpu_addr);
 
        /* stitch together an VCE destroy msg */
        ib->length_dw = 0;
@@ -585,9 +597,15 @@ static int amdgpu_vce_get_destroy_msg(struct amdgpu_ring 
*ring, uint32_t handle,
        ib->ptr[ib->length_dw++] = 0x00000001; /* destroy session */
        ib->ptr[ib->length_dw++] = 0x00000000;
        ib->ptr[ib->length_dw++] = 0x00000000;
-       ib->ptr[ib->length_dw++] = 0xffffffff; /* feedback is not needed, set 
to 0xffffffff and firmware will not output feedback */
+       ib->ptr[ib->length_dw++] = 0xffffffff;
        ib->ptr[ib->length_dw++] = 0x00000000;
 
+       ib->ptr[ib->length_dw++] = 0x00000014; /* len */
+       ib->ptr[ib->length_dw++] = 0x05000005; /* feedback buffer */
+       ib->ptr[ib->length_dw++] = upper_32_bits(addr);
+       ib->ptr[ib->length_dw++] = addr;
+       ib->ptr[ib->length_dw++] = 0x00000001;
+
        ib->ptr[ib->length_dw++] = 0x00000008; /* len */
        ib->ptr[ib->length_dw++] = 0x02000001; /* destroy cmd */
 
@@ -598,6 +616,7 @@ static int amdgpu_vce_get_destroy_msg(struct amdgpu_ring 
*ring, uint32_t handle,
                r = amdgpu_job_submit_direct(job, ring, &f);
        else
                f = amdgpu_job_submit(job);
+       amdgpu_ib_free(&ib_msg, f);
        if (r)
                goto err;
 
-- 
2.43.0

Reply via email to