@@ -105,6 +105,16 @@ static void amdgpu_mux_resubmit_chunks(struct amdgpu_ring_mux *mux)
105105 amdgpu_fence_update_start_timestamp (e -> ring ,
106106 chunk -> sync_seq ,
107107 ktime_get ());
108+ if (chunk -> sync_seq ==
109+ le32_to_cpu (* (e -> ring -> fence_drv .cpu_addr + 2 ))) {
110+ if (chunk -> cntl_offset <= e -> ring -> buf_mask )
111+ amdgpu_ring_patch_cntl (e -> ring ,
112+ chunk -> cntl_offset );
113+ if (chunk -> ce_offset <= e -> ring -> buf_mask )
114+ amdgpu_ring_patch_ce (e -> ring , chunk -> ce_offset );
115+ if (chunk -> de_offset <= e -> ring -> buf_mask )
116+ amdgpu_ring_patch_de (e -> ring , chunk -> de_offset );
117+ }
108118 amdgpu_ring_mux_copy_pkt_from_sw_ring (mux , e -> ring ,
109119 chunk -> start ,
110120 chunk -> end );
@@ -407,6 +417,17 @@ void amdgpu_sw_ring_ib_end(struct amdgpu_ring *ring)
407417 amdgpu_ring_mux_end_ib (mux , ring );
408418}
409419
420+ void amdgpu_sw_ring_ib_mark_offset (struct amdgpu_ring * ring , enum amdgpu_ring_mux_offset_type type )
421+ {
422+ struct amdgpu_device * adev = ring -> adev ;
423+ struct amdgpu_ring_mux * mux = & adev -> gfx .muxer ;
424+ unsigned offset ;
425+
426+ offset = ring -> wptr & ring -> buf_mask ;
427+
428+ amdgpu_ring_mux_ib_mark_offset (mux , ring , offset , type );
429+ }
430+
410431void amdgpu_ring_mux_start_ib (struct amdgpu_ring_mux * mux , struct amdgpu_ring * ring )
411432{
412433 struct amdgpu_mux_entry * e ;
@@ -429,6 +450,10 @@ void amdgpu_ring_mux_start_ib(struct amdgpu_ring_mux *mux, struct amdgpu_ring *r
429450 }
430451
431452 chunk -> start = ring -> wptr ;
453+ /* the initialized value used to check if they are set by the ib submission*/
454+ chunk -> cntl_offset = ring -> buf_mask + 1 ;
455+ chunk -> de_offset = ring -> buf_mask + 1 ;
456+ chunk -> ce_offset = ring -> buf_mask + 1 ;
432457 list_add_tail (& chunk -> entry , & e -> list );
433458}
434459
@@ -454,6 +479,41 @@ static void scan_and_remove_signaled_chunk(struct amdgpu_ring_mux *mux, struct a
454479 }
455480}
456481
482+ void amdgpu_ring_mux_ib_mark_offset (struct amdgpu_ring_mux * mux ,
483+ struct amdgpu_ring * ring , u64 offset ,
484+ enum amdgpu_ring_mux_offset_type type )
485+ {
486+ struct amdgpu_mux_entry * e ;
487+ struct amdgpu_mux_chunk * chunk ;
488+
489+ e = amdgpu_ring_mux_sw_entry (mux , ring );
490+ if (!e ) {
491+ DRM_ERROR ("cannot find entry!\n" );
492+ return ;
493+ }
494+
495+ chunk = list_last_entry (& e -> list , struct amdgpu_mux_chunk , entry );
496+ if (!chunk ) {
497+ DRM_ERROR ("cannot find chunk!\n" );
498+ return ;
499+ }
500+
501+ switch (type ) {
502+ case AMDGPU_MUX_OFFSET_TYPE_CONTROL :
503+ chunk -> cntl_offset = offset ;
504+ break ;
505+ case AMDGPU_MUX_OFFSET_TYPE_DE :
506+ chunk -> de_offset = offset ;
507+ break ;
508+ case AMDGPU_MUX_OFFSET_TYPE_CE :
509+ chunk -> ce_offset = offset ;
510+ break ;
511+ default :
512+ DRM_ERROR ("invalid type (%d)\n" , type );
513+ break ;
514+ }
515+ }
516+
457517void amdgpu_ring_mux_end_ib (struct amdgpu_ring_mux * mux , struct amdgpu_ring * ring )
458518{
459519 struct amdgpu_mux_entry * e ;
0 commit comments