Skip to content

Commit 26f5f34

Browse files
Lang Yualexdeucher
authored andcommitted
drm/amdgpu/vpe: add collaborate mode support for VPE
Under clollaborate mode, multiple VPE instances share a ring buferr and work together to finish a job. Signed-off-by: Lang Yu <Lang.Yu@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
1 parent 72f4ae0 commit 26f5f34

File tree

2 files changed

+21
-0
lines changed

2 files changed

+21
-0
lines changed

drivers/gpu/drm/amd/amdgpu/amdgpu_vpe.c

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -457,6 +457,18 @@ static uint64_t vpe_get_csa_mc_addr(struct amdgpu_ring *ring, uint32_t vmid)
457457
return csa_mc_addr;
458458
}
459459

460+
static void vpe_ring_emit_pred_exec(struct amdgpu_ring *ring,
461+
uint32_t device_select,
462+
uint32_t exec_count)
463+
{
464+
if (!ring->adev->vpe.collaborate_mode)
465+
return;
466+
467+
amdgpu_ring_write(ring, VPE_CMD_HEADER(VPE_CMD_OPCODE_PRED_EXE, 0) |
468+
(device_select << 16));
469+
amdgpu_ring_write(ring, exec_count & 0x1fff);
470+
}
471+
460472
static void vpe_ring_emit_ib(struct amdgpu_ring *ring,
461473
struct amdgpu_job *job,
462474
struct amdgpu_ib *ib,
@@ -481,6 +493,8 @@ static void vpe_ring_emit_fence(struct amdgpu_ring *ring, uint64_t addr,
481493
{
482494
int i = 0;
483495

496+
vpe_ring_emit_pred_exec(ring, 0, 10);
497+
484498
do {
485499
/* write the fence */
486500
amdgpu_ring_write(ring, VPE_CMD_HEADER(VPE_CMD_OPCODE_FENCE, 0));
@@ -505,6 +519,8 @@ static void vpe_ring_emit_pipeline_sync(struct amdgpu_ring *ring)
505519
uint32_t seq = ring->fence_drv.sync_seq;
506520
uint64_t addr = ring->fence_drv.gpu_addr;
507521

522+
vpe_ring_emit_pred_exec(ring, 0, 6);
523+
508524
/* wait for idle */
509525
amdgpu_ring_write(ring, VPE_CMD_HEADER(VPE_CMD_OPCODE_POLL_REGMEM,
510526
VPE_POLL_REGMEM_SUBOP_REGMEM) |
@@ -520,6 +536,8 @@ static void vpe_ring_emit_pipeline_sync(struct amdgpu_ring *ring)
520536

521537
static void vpe_ring_emit_wreg(struct amdgpu_ring *ring, uint32_t reg, uint32_t val)
522538
{
539+
vpe_ring_emit_pred_exec(ring, 0, 3);
540+
523541
amdgpu_ring_write(ring, VPE_CMD_HEADER(VPE_CMD_OPCODE_REG_WRITE, 0));
524542
amdgpu_ring_write(ring, reg << 2);
525543
amdgpu_ring_write(ring, val);
@@ -528,6 +546,8 @@ static void vpe_ring_emit_wreg(struct amdgpu_ring *ring, uint32_t reg, uint32_t
528546
static void vpe_ring_emit_reg_wait(struct amdgpu_ring *ring, uint32_t reg,
529547
uint32_t val, uint32_t mask)
530548
{
549+
vpe_ring_emit_pred_exec(ring, 0, 6);
550+
531551
amdgpu_ring_write(ring, VPE_CMD_HEADER(VPE_CMD_OPCODE_POLL_REGMEM,
532552
VPE_POLL_REGMEM_SUBOP_REGMEM) |
533553
VPE_CMD_POLL_REGMEM_HEADER_FUNC(3) | /* equal */

drivers/gpu/drm/amd/amdgpu/amdgpu_vpe.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ struct amdgpu_vpe {
7878
bool context_started;
7979

8080
uint32_t num_instances;
81+
bool collaborate_mode;
8182
};
8283

8384
int amdgpu_vpe_psp_update_sram(struct amdgpu_device *adev);

0 commit comments

Comments
 (0)