@@ -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+
460472static 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
521537static 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
528546static 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 */
0 commit comments