@@ -202,6 +202,8 @@ static int add_queue_mes(struct device_queue_manager *dqm, struct queue *q,
202
202
int r , queue_type ;
203
203
uint64_t wptr_addr_off ;
204
204
205
+ if (!dqm -> sched_running || dqm -> sched_halt )
206
+ return 0 ;
205
207
if (!down_read_trylock (& adev -> reset_domain -> sem ))
206
208
return - EIO ;
207
209
@@ -270,6 +272,8 @@ static int remove_queue_mes(struct device_queue_manager *dqm, struct queue *q,
270
272
int r ;
271
273
struct mes_remove_queue_input queue_input ;
272
274
275
+ if (!dqm -> sched_running || dqm -> sched_halt )
276
+ return 0 ;
273
277
if (!down_read_trylock (& adev -> reset_domain -> sem ))
274
278
return - EIO ;
275
279
@@ -292,7 +296,7 @@ static int remove_queue_mes(struct device_queue_manager *dqm, struct queue *q,
292
296
return r ;
293
297
}
294
298
295
- static int remove_all_queues_mes (struct device_queue_manager * dqm )
299
+ static int remove_all_kfd_queues_mes (struct device_queue_manager * dqm )
296
300
{
297
301
struct device_process_node * cur ;
298
302
struct device * dev = dqm -> dev -> adev -> dev ;
@@ -319,6 +323,33 @@ static int remove_all_queues_mes(struct device_queue_manager *dqm)
319
323
return retval ;
320
324
}
321
325
326
+ static int add_all_kfd_queues_mes (struct device_queue_manager * dqm )
327
+ {
328
+ struct device_process_node * cur ;
329
+ struct device * dev = dqm -> dev -> adev -> dev ;
330
+ struct qcm_process_device * qpd ;
331
+ struct queue * q ;
332
+ int retval = 0 ;
333
+
334
+ list_for_each_entry (cur , & dqm -> queues , list ) {
335
+ qpd = cur -> qpd ;
336
+ list_for_each_entry (q , & qpd -> queues_list , list ) {
337
+ if (!q -> properties .is_active )
338
+ continue ;
339
+ retval = add_queue_mes (dqm , q , qpd );
340
+ if (retval ) {
341
+ dev_err (dev , "%s: Failed to add queue %d for dev %d" ,
342
+ __func__ ,
343
+ q -> properties .queue_id ,
344
+ dqm -> dev -> id );
345
+ return retval ;
346
+ }
347
+ }
348
+ }
349
+
350
+ return retval ;
351
+ }
352
+
322
353
static int suspend_all_queues_mes (struct device_queue_manager * dqm )
323
354
{
324
355
struct amdgpu_device * adev = (struct amdgpu_device * )dqm -> dev -> adev ;
@@ -1742,7 +1773,7 @@ static int halt_cpsch(struct device_queue_manager *dqm)
1742
1773
KFD_UNMAP_QUEUES_FILTER_ALL_QUEUES , 0 ,
1743
1774
USE_DEFAULT_GRACE_PERIOD , false);
1744
1775
else
1745
- ret = remove_all_queues_mes (dqm );
1776
+ ret = remove_all_kfd_queues_mes (dqm );
1746
1777
}
1747
1778
dqm -> sched_halt = true;
1748
1779
dqm_unlock (dqm );
@@ -1768,6 +1799,9 @@ static int unhalt_cpsch(struct device_queue_manager *dqm)
1768
1799
ret = execute_queues_cpsch (dqm ,
1769
1800
KFD_UNMAP_QUEUES_FILTER_DYNAMIC_QUEUES ,
1770
1801
0 , USE_DEFAULT_GRACE_PERIOD );
1802
+ else
1803
+ ret = add_all_kfd_queues_mes (dqm );
1804
+
1771
1805
dqm_unlock (dqm );
1772
1806
1773
1807
return ret ;
@@ -1867,7 +1901,7 @@ static int stop_cpsch(struct device_queue_manager *dqm)
1867
1901
if (!dqm -> dev -> kfd -> shared_resources .enable_mes )
1868
1902
unmap_queues_cpsch (dqm , KFD_UNMAP_QUEUES_FILTER_ALL_QUEUES , 0 , USE_DEFAULT_GRACE_PERIOD , false);
1869
1903
else
1870
- remove_all_queues_mes (dqm );
1904
+ remove_all_kfd_queues_mes (dqm );
1871
1905
1872
1906
dqm -> sched_running = false;
1873
1907
0 commit comments