@@ -171,33 +171,21 @@ static bool part_handle_idle_ctx(struct aie2_partition *part, bool force)
171
171
}
172
172
173
173
static bool
174
- part_is_all_ctx_stuck (struct aie2_partition * part )
174
+ part_has_pending_cmd (struct aie2_partition * part )
175
175
{
176
176
struct amdxdna_dev * xdna ;
177
177
struct amdxdna_ctx * ctx ;
178
- int progress_cnt = 0 ;
179
- int running_cnt = 0 ;
180
178
181
179
xdna = ctx_rq_to_xdna_dev (part -> rq );
182
180
list_for_each_entry (ctx , & part -> conn_list , entry ) {
183
- u64 completed = ctx -> completed ;
184
- u64 last = ctx -> last_completed ;
185
- u64 submitted = ctx -> submitted ;
186
-
187
- XDNA_DBG (xdna , "%s @[%d, %d] submitted %lld completed %lld last %lld" ,
181
+ XDNA_DBG (xdna , "%s @[%d, %d] submitted %lld completed %lld" ,
188
182
ctx -> name , part -> start_col , part -> end_col ,
189
- submitted , completed , last );
190
- if (submitted == completed )
191
- continue ;
192
-
193
- running_cnt ++ ;
194
- if (last != completed ) {
195
- ctx -> last_completed = completed ;
196
- progress_cnt ++ ;
197
- }
183
+ ctx -> submitted , ctx -> completed );
184
+ if (ctx -> submitted != ctx -> completed )
185
+ return true;
198
186
}
199
187
200
- return running_cnt && ! progress_cnt ;
188
+ return false ;
201
189
}
202
190
203
191
static struct aie2_partition *
@@ -812,26 +800,37 @@ static void rq_parts_work(struct work_struct *work)
812
800
*/
813
801
bool aie2_rq_is_all_context_stuck (struct aie2_ctx_rq * rq )
814
802
{
803
+ struct amdxdna_dev_hdl * ndev ;
815
804
struct aie2_partition * part ;
816
805
struct amdxdna_dev * xdna ;
817
- int active_cnt = 0 ;
818
- int stuck_cnt = 0 ;
806
+ bool pending = false ;
807
+ u32 tdr ;
819
808
int i ;
820
809
821
810
xdna = ctx_rq_to_xdna_dev (rq );
811
+ ndev = xdna -> dev_handle ;
822
812
mutex_lock (& xdna -> dev_lock );
823
813
for (i = 0 ; i < rq -> num_parts ; i ++ ) {
824
814
part = & rq -> parts [i ];
825
815
if (!part -> hwctx_cnt )
826
816
continue ;
827
817
828
- active_cnt ++ ;
829
- if (part_is_all_ctx_stuck ( part ) )
830
- stuck_cnt ++ ;
818
+ pending = part_has_pending_cmd ( part ) ;
819
+ if (pending )
820
+ break ;
831
821
}
832
822
mutex_unlock (& xdna -> dev_lock );
833
823
834
- return active_cnt && active_cnt == stuck_cnt ;
824
+ tdr = READ_ONCE (ndev -> tdr_status );
825
+ if (pending && xdna -> tdr .progress == tdr && tdr == AIE2_TDR_WAIT )
826
+ return true;
827
+
828
+ if (tdr != AIE2_TDR_WAIT )
829
+ WRITE_ONCE (ndev -> tdr_status , AIE2_TDR_WAIT );
830
+
831
+ xdna -> tdr .progress = tdr ;
832
+
833
+ return false;
835
834
}
836
835
837
836
bool aie2_rq_handle_idle_ctx (struct aie2_ctx_rq * rq )
0 commit comments