@@ -5139,9 +5139,83 @@ static void gfx_v9_0_ring_emit_ib_gfx(struct amdgpu_ring *ring,
51395139#endif
51405140 lower_32_bits (ib -> gpu_addr ));
51415141 amdgpu_ring_write (ring , upper_32_bits (ib -> gpu_addr ));
5142+ amdgpu_ring_ib_on_emit_cntl (ring );
51425143 amdgpu_ring_write (ring , control );
51435144}
51445145
5146+ static void gfx_v9_0_ring_patch_cntl (struct amdgpu_ring * ring ,
5147+ unsigned offset )
5148+ {
5149+ u32 control = ring -> ring [offset ];
5150+
5151+ control |= INDIRECT_BUFFER_PRE_RESUME (1 );
5152+ ring -> ring [offset ] = control ;
5153+ }
5154+
5155+ static void gfx_v9_0_ring_patch_ce_meta (struct amdgpu_ring * ring ,
5156+ unsigned offset )
5157+ {
5158+ struct amdgpu_device * adev = ring -> adev ;
5159+ void * ce_payload_cpu_addr ;
5160+ uint64_t payload_offset , payload_size ;
5161+
5162+ payload_size = sizeof (struct v9_ce_ib_state );
5163+
5164+ if (ring -> is_mes_queue ) {
5165+ payload_offset = offsetof(struct amdgpu_mes_ctx_meta_data ,
5166+ gfx [0 ].gfx_meta_data ) +
5167+ offsetof(struct v9_gfx_meta_data , ce_payload );
5168+ ce_payload_cpu_addr =
5169+ amdgpu_mes_ctx_get_offs_cpu_addr (ring , payload_offset );
5170+ } else {
5171+ payload_offset = offsetof(struct v9_gfx_meta_data , ce_payload );
5172+ ce_payload_cpu_addr = adev -> virt .csa_cpu_addr + payload_offset ;
5173+ }
5174+
5175+ if (offset + (payload_size >> 2 ) <= ring -> buf_mask + 1 ) {
5176+ memcpy ((void * )& ring -> ring [offset ], ce_payload_cpu_addr , payload_size );
5177+ } else {
5178+ memcpy ((void * )& ring -> ring [offset ], ce_payload_cpu_addr ,
5179+ (ring -> buf_mask + 1 - offset ) << 2 );
5180+ payload_size -= (ring -> buf_mask + 1 - offset ) << 2 ;
5181+ memcpy ((void * )& ring -> ring [0 ],
5182+ ce_payload_cpu_addr + ((ring -> buf_mask + 1 - offset ) << 2 ),
5183+ payload_size );
5184+ }
5185+ }
5186+
5187+ static void gfx_v9_0_ring_patch_de_meta (struct amdgpu_ring * ring ,
5188+ unsigned offset )
5189+ {
5190+ struct amdgpu_device * adev = ring -> adev ;
5191+ void * de_payload_cpu_addr ;
5192+ uint64_t payload_offset , payload_size ;
5193+
5194+ payload_size = sizeof (struct v9_de_ib_state );
5195+
5196+ if (ring -> is_mes_queue ) {
5197+ payload_offset = offsetof(struct amdgpu_mes_ctx_meta_data ,
5198+ gfx [0 ].gfx_meta_data ) +
5199+ offsetof(struct v9_gfx_meta_data , de_payload );
5200+ de_payload_cpu_addr =
5201+ amdgpu_mes_ctx_get_offs_cpu_addr (ring , payload_offset );
5202+ } else {
5203+ payload_offset = offsetof(struct v9_gfx_meta_data , de_payload );
5204+ de_payload_cpu_addr = adev -> virt .csa_cpu_addr + payload_offset ;
5205+ }
5206+
5207+ if (offset + (payload_size >> 2 ) <= ring -> buf_mask + 1 ) {
5208+ memcpy ((void * )& ring -> ring [offset ], de_payload_cpu_addr , payload_size );
5209+ } else {
5210+ memcpy ((void * )& ring -> ring [offset ], de_payload_cpu_addr ,
5211+ (ring -> buf_mask + 1 - offset ) << 2 );
5212+ payload_size -= (ring -> buf_mask + 1 - offset ) << 2 ;
5213+ memcpy ((void * )& ring -> ring [0 ],
5214+ de_payload_cpu_addr + ((ring -> buf_mask + 1 - offset ) << 2 ),
5215+ payload_size );
5216+ }
5217+ }
5218+
51455219static void gfx_v9_0_ring_emit_ib_compute (struct amdgpu_ring * ring ,
51465220 struct amdgpu_job * job ,
51475221 struct amdgpu_ib * ib ,
@@ -5337,6 +5411,8 @@ static void gfx_v9_0_ring_emit_ce_meta(struct amdgpu_ring *ring, bool resume)
53375411 amdgpu_ring_write (ring , lower_32_bits (ce_payload_gpu_addr ));
53385412 amdgpu_ring_write (ring , upper_32_bits (ce_payload_gpu_addr ));
53395413
5414+ amdgpu_ring_ib_on_emit_ce (ring );
5415+
53405416 if (resume )
53415417 amdgpu_ring_write_multiple (ring , ce_payload_cpu_addr ,
53425418 sizeof (ce_payload ) >> 2 );
@@ -5448,6 +5524,7 @@ static void gfx_v9_0_ring_emit_de_meta(struct amdgpu_ring *ring, bool resume, bo
54485524 amdgpu_ring_write (ring , lower_32_bits (de_payload_gpu_addr ));
54495525 amdgpu_ring_write (ring , upper_32_bits (de_payload_gpu_addr ));
54505526
5527+ amdgpu_ring_ib_on_emit_de (ring );
54515528 if (resume )
54525529 amdgpu_ring_write_multiple (ring , de_payload_cpu_addr ,
54535530 sizeof (de_payload ) >> 2 );
@@ -6858,6 +6935,9 @@ static const struct amdgpu_ring_funcs gfx_v9_0_sw_ring_funcs_gfx = {
68586935 .emit_reg_write_reg_wait = gfx_v9_0_ring_emit_reg_write_reg_wait ,
68596936 .soft_recovery = gfx_v9_0_ring_soft_recovery ,
68606937 .emit_mem_sync = gfx_v9_0_emit_mem_sync ,
6938+ .patch_cntl = gfx_v9_0_ring_patch_cntl ,
6939+ .patch_de = gfx_v9_0_ring_patch_de_meta ,
6940+ .patch_ce = gfx_v9_0_ring_patch_ce_meta ,
68616941};
68626942
68636943static const struct amdgpu_ring_funcs gfx_v9_0_ring_funcs_compute = {
0 commit comments