[PATCH 2/2] drm/amdgpu/vcn: send session ctx along with msg buffer
boyuan.zhang at amd.com
boyuan.zhang at amd.com
Sat Feb 22 02:05:30 UTC 2025
From: Boyuan Zhang <boyuan.zhang at amd.com>
Session context buffer is required to be sent along with message buffer
Signed-off-by: Boyuan Zhang <boyuan.zhang at amd.com>
Tested-by: Yinjie Yao <yinjie.yao at amd.com>
---
drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c | 43 ++++++++++++++++++-------
1 file changed, 31 insertions(+), 12 deletions(-)
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
index 83faf6e6788a..8d2cce3ea7af 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c
@@ -602,18 +602,29 @@ static int amdgpu_vcn_dec_send_msg(struct amdgpu_ring *ring,
}
static int amdgpu_vcn_dec_get_create_msg(struct amdgpu_ring *ring, uint32_t handle,
- struct amdgpu_ib *ib)
+ struct amdgpu_ib *ib, struct amdgpu_ib *ctx)
{
struct amdgpu_device *adev = ring->adev;
uint32_t *msg;
int r, i;
- memset(ib, 0, sizeof(*ib));
- r = amdgpu_ib_get(adev, NULL, AMDGPU_GPU_PAGE_SIZE * 2,
- AMDGPU_IB_POOL_DIRECT,
- ib);
- if (r)
- return r;
+ if (ctx) {
+ memset(ctx, 0, sizeof(*ctx));
+ r = amdgpu_ib_get(adev, NULL, AMDGPU_GPU_PAGE_SIZE * 32,
+ AMDGPU_IB_POOL_DIRECT,
+ ctx);
+ if (r)
+ return r;
+ }
+
+ if (ib) {
+ memset(ib, 0, sizeof(*ib));
+ r = amdgpu_ib_get(adev, NULL, AMDGPU_GPU_PAGE_SIZE * 2,
+ AMDGPU_IB_POOL_DIRECT,
+ ib);
+ if (r)
+ return r;
+ }
msg = (uint32_t *)AMDGPU_GPU_PAGE_ALIGN((unsigned long)ib->ptr);
msg[0] = cpu_to_le32(0x00000028);
@@ -669,7 +680,7 @@ int amdgpu_vcn_dec_ring_test_ib(struct amdgpu_ring *ring, long timeout)
struct amdgpu_ib ib;
long r;
- r = amdgpu_vcn_dec_get_create_msg(ring, 1, &ib);
+ r = amdgpu_vcn_dec_get_create_msg(ring, 1, &ib, NULL);
if (r)
goto error;
@@ -727,6 +738,7 @@ static void amdgpu_vcn_unified_ring_ib_checksum(uint32_t **ib_checksum,
static int amdgpu_vcn_dec_sw_send_msg(struct amdgpu_ring *ring,
struct amdgpu_ib *ib_msg,
+ struct amdgpu_ib *ib_ctx,
struct dma_fence **fence)
{
struct amdgpu_vcn_decode_buffer *decode_buffer = NULL;
@@ -735,6 +747,7 @@ static int amdgpu_vcn_dec_sw_send_msg(struct amdgpu_ring *ring,
struct dma_fence *f = NULL;
struct amdgpu_job *job;
struct amdgpu_ib *ib;
+ uint64_t addr_ctx = AMDGPU_GPU_PAGE_ALIGN(ib_ctx->gpu_addr);
uint64_t addr = AMDGPU_GPU_PAGE_ALIGN(ib_msg->gpu_addr);
uint32_t *ib_checksum;
uint32_t ib_pack_in_dw;
@@ -765,6 +778,10 @@ static int amdgpu_vcn_dec_sw_send_msg(struct amdgpu_ring *ring,
ib->length_dw += sizeof(struct amdgpu_vcn_decode_buffer) / 4;
memset(decode_buffer, 0, sizeof(struct amdgpu_vcn_decode_buffer));
+ decode_buffer->valid_buf_flag |= cpu_to_le32(AMDGPU_VCN_CMD_FLAG_SESSION_CONTEXT_BUFFER);
+ decode_buffer->session_ctx_buffer_address_hi = cpu_to_le32(addr_ctx >> 32);
+ decode_buffer->session_ctx_buffer_address_lo = cpu_to_le32(addr_ctx);
+
decode_buffer->valid_buf_flag |= cpu_to_le32(AMDGPU_VCN_CMD_FLAG_MSG_BUFFER);
decode_buffer->msg_buffer_address_hi = cpu_to_le32(addr >> 32);
decode_buffer->msg_buffer_address_lo = cpu_to_le32(addr);
@@ -780,6 +797,7 @@ static int amdgpu_vcn_dec_sw_send_msg(struct amdgpu_ring *ring,
goto err_free;
amdgpu_ib_free(ib_msg, f);
+ amdgpu_ib_free(ib_ctx, f);
if (fence)
*fence = dma_fence_get(f);
@@ -791,27 +809,28 @@ static int amdgpu_vcn_dec_sw_send_msg(struct amdgpu_ring *ring,
amdgpu_job_free(job);
err:
amdgpu_ib_free(ib_msg, f);
+ amdgpu_ib_free(ib_ctx, f);
return r;
}
int amdgpu_vcn_dec_sw_ring_test_ib(struct amdgpu_ring *ring, long timeout)
{
struct dma_fence *fence = NULL;
- struct amdgpu_ib ib;
+ struct amdgpu_ib ib, ctx;
long r;
- r = amdgpu_vcn_dec_get_create_msg(ring, 1, &ib);
+ r = amdgpu_vcn_dec_get_create_msg(ring, 1, &ib, &ctx);
if (r)
goto error;
- r = amdgpu_vcn_dec_sw_send_msg(ring, &ib, NULL);
+ r = amdgpu_vcn_dec_sw_send_msg(ring, &ib, &ctx, NULL);
if (r)
goto error;
r = amdgpu_vcn_dec_get_destroy_msg(ring, 1, &ib);
if (r)
goto error;
- r = amdgpu_vcn_dec_sw_send_msg(ring, &ib, &fence);
+ r = amdgpu_vcn_dec_sw_send_msg(ring, &ib, &ctx, &fence);
if (r)
goto error;
--
2.34.1
More information about the amd-gfx
mailing list