@@ -5139,9 +5139,83 @@ static void gfx_v9_0_ring_emit_ib_gfx(struct amdgpu_ring *ring,
5139
5139
#endif
5140
5140
lower_32_bits (ib -> gpu_addr ));
5141
5141
amdgpu_ring_write (ring , upper_32_bits (ib -> gpu_addr ));
5142
+ amdgpu_ring_ib_on_emit_cntl (ring );
5142
5143
amdgpu_ring_write (ring , control );
5143
5144
}
5144
5145
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
+
5145
5219
static void gfx_v9_0_ring_emit_ib_compute (struct amdgpu_ring * ring ,
5146
5220
struct amdgpu_job * job ,
5147
5221
struct amdgpu_ib * ib ,
@@ -5337,6 +5411,8 @@ static void gfx_v9_0_ring_emit_ce_meta(struct amdgpu_ring *ring, bool resume)
5337
5411
amdgpu_ring_write (ring , lower_32_bits (ce_payload_gpu_addr ));
5338
5412
amdgpu_ring_write (ring , upper_32_bits (ce_payload_gpu_addr ));
5339
5413
5414
+ amdgpu_ring_ib_on_emit_ce (ring );
5415
+
5340
5416
if (resume )
5341
5417
amdgpu_ring_write_multiple (ring , ce_payload_cpu_addr ,
5342
5418
sizeof (ce_payload ) >> 2 );
@@ -5448,6 +5524,7 @@ static void gfx_v9_0_ring_emit_de_meta(struct amdgpu_ring *ring, bool resume, bo
5448
5524
amdgpu_ring_write (ring , lower_32_bits (de_payload_gpu_addr ));
5449
5525
amdgpu_ring_write (ring , upper_32_bits (de_payload_gpu_addr ));
5450
5526
5527
+ amdgpu_ring_ib_on_emit_de (ring );
5451
5528
if (resume )
5452
5529
amdgpu_ring_write_multiple (ring , de_payload_cpu_addr ,
5453
5530
sizeof (de_payload ) >> 2 );
@@ -6858,6 +6935,9 @@ static const struct amdgpu_ring_funcs gfx_v9_0_sw_ring_funcs_gfx = {
6858
6935
.emit_reg_write_reg_wait = gfx_v9_0_ring_emit_reg_write_reg_wait ,
6859
6936
.soft_recovery = gfx_v9_0_ring_soft_recovery ,
6860
6937
.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 ,
6861
6941
};
6862
6942
6863
6943
static const struct amdgpu_ring_funcs gfx_v9_0_ring_funcs_compute = {
0 commit comments