@@ -457,6 +457,18 @@ static uint64_t vpe_get_csa_mc_addr(struct amdgpu_ring *ring, uint32_t vmid)
457
457
return csa_mc_addr ;
458
458
}
459
459
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
+
460
472
static void vpe_ring_emit_ib (struct amdgpu_ring * ring ,
461
473
struct amdgpu_job * job ,
462
474
struct amdgpu_ib * ib ,
@@ -481,6 +493,8 @@ static void vpe_ring_emit_fence(struct amdgpu_ring *ring, uint64_t addr,
481
493
{
482
494
int i = 0 ;
483
495
496
+ vpe_ring_emit_pred_exec (ring , 0 , 10 );
497
+
484
498
do {
485
499
/* write the fence */
486
500
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)
505
519
uint32_t seq = ring -> fence_drv .sync_seq ;
506
520
uint64_t addr = ring -> fence_drv .gpu_addr ;
507
521
522
+ vpe_ring_emit_pred_exec (ring , 0 , 6 );
523
+
508
524
/* wait for idle */
509
525
amdgpu_ring_write (ring , VPE_CMD_HEADER (VPE_CMD_OPCODE_POLL_REGMEM ,
510
526
VPE_POLL_REGMEM_SUBOP_REGMEM ) |
@@ -520,6 +536,8 @@ static void vpe_ring_emit_pipeline_sync(struct amdgpu_ring *ring)
520
536
521
537
static void vpe_ring_emit_wreg (struct amdgpu_ring * ring , uint32_t reg , uint32_t val )
522
538
{
539
+ vpe_ring_emit_pred_exec (ring , 0 , 3 );
540
+
523
541
amdgpu_ring_write (ring , VPE_CMD_HEADER (VPE_CMD_OPCODE_REG_WRITE , 0 ));
524
542
amdgpu_ring_write (ring , reg << 2 );
525
543
amdgpu_ring_write (ring , val );
@@ -528,6 +546,8 @@ static void vpe_ring_emit_wreg(struct amdgpu_ring *ring, uint32_t reg, uint32_t
528
546
static void vpe_ring_emit_reg_wait (struct amdgpu_ring * ring , uint32_t reg ,
529
547
uint32_t val , uint32_t mask )
530
548
{
549
+ vpe_ring_emit_pred_exec (ring , 0 , 6 );
550
+
531
551
amdgpu_ring_write (ring , VPE_CMD_HEADER (VPE_CMD_OPCODE_POLL_REGMEM ,
532
552
VPE_POLL_REGMEM_SUBOP_REGMEM ) |
533
553
VPE_CMD_POLL_REGMEM_HEADER_FUNC (3 ) | /* equal */
0 commit comments