hc
2024-01-03 2f7c68cb55ecb7331f2381deb497c27155f32faf
kernel/drivers/gpu/drm/amd/amdkfd/kfd_packet_manager.c
....@@ -41,14 +41,15 @@
4141 unsigned int *rlib_size,
4242 bool *over_subscription)
4343 {
44
- unsigned int process_count, queue_count, compute_queue_count;
44
+ unsigned int process_count, queue_count, compute_queue_count, gws_queue_count;
4545 unsigned int map_queue_size;
4646 unsigned int max_proc_per_quantum = 1;
4747 struct kfd_dev *dev = pm->dqm->dev;
4848
4949 process_count = pm->dqm->processes_count;
50
- queue_count = pm->dqm->queue_count;
51
- compute_queue_count = queue_count - pm->dqm->sdma_queue_count;
50
+ queue_count = pm->dqm->active_queue_count;
51
+ compute_queue_count = pm->dqm->active_cp_queue_count;
52
+ gws_queue_count = pm->dqm->gws_queue_count;
5253
5354 /* check if there is over subscription
5455 * Note: the arbitration between the number of VMIDs and
....@@ -61,7 +62,8 @@
6162 max_proc_per_quantum = dev->max_proc_per_quantum;
6263
6364 if ((process_count > max_proc_per_quantum) ||
64
- compute_queue_count > get_queues_num(pm->dqm)) {
65
+ compute_queue_count > get_cp_queues_num(pm->dqm) ||
66
+ gws_queue_count > 1) {
6567 *over_subscription = true;
6668 pr_debug("Over subscribed runlist\n");
6769 }
....@@ -140,7 +142,7 @@
140142 pm->ib_size_bytes = alloc_size_bytes;
141143
142144 pr_debug("Building runlist ib process count: %d queues count %d\n",
143
- pm->dqm->processes_count, pm->dqm->queue_count);
145
+ pm->dqm->processes_count, pm->dqm->active_queue_count);
144146
145147 /* build the run list ib packet */
146148 list_for_each_entry(cur, queues, list) {
....@@ -202,11 +204,15 @@
202204
203205 pr_debug("Finished map process and queues to runlist\n");
204206
205
- if (is_over_subscription)
207
+ if (is_over_subscription) {
208
+ if (!pm->is_over_subscription)
209
+ pr_warn("Runlist is getting oversubscribed. Expect reduced ROCm performance.\n");
206210 retval = pm->pmf->runlist(pm, &rl_buffer[rl_wptr],
207211 *rl_gpu_addr,
208212 alloc_size_bytes / sizeof(uint32_t),
209213 true);
214
+ }
215
+ pm->is_over_subscription = is_over_subscription;
210216
211217 for (i = 0; i < alloc_size_bytes / sizeof(uint32_t); i++)
212218 pr_debug("0x%2X ", rl_buffer[i]);
....@@ -226,10 +232,21 @@
226232 case CHIP_FIJI:
227233 case CHIP_POLARIS10:
228234 case CHIP_POLARIS11:
235
+ case CHIP_POLARIS12:
236
+ case CHIP_VEGAM:
229237 pm->pmf = &kfd_vi_pm_funcs;
230238 break;
231239 case CHIP_VEGA10:
240
+ case CHIP_VEGA12:
241
+ case CHIP_VEGA20:
232242 case CHIP_RAVEN:
243
+ case CHIP_RENOIR:
244
+ case CHIP_ARCTURUS:
245
+ case CHIP_NAVI10:
246
+ case CHIP_NAVI12:
247
+ case CHIP_NAVI14:
248
+ case CHIP_SIENNA_CICHLID:
249
+ case CHIP_NAVY_FLOUNDER:
233250 pm->pmf = &kfd_v9_pm_funcs;
234251 break;
235252 default:
....@@ -250,10 +267,10 @@
250267 return 0;
251268 }
252269
253
-void pm_uninit(struct packet_manager *pm)
270
+void pm_uninit(struct packet_manager *pm, bool hanging)
254271 {
255272 mutex_destroy(&pm->lock);
256
- kernel_queue_uninit(pm->priv_queue);
273
+ kernel_queue_uninit(pm->priv_queue, hanging);
257274 }
258275
259276 int pm_send_set_resources(struct packet_manager *pm,
....@@ -264,7 +281,7 @@
264281
265282 size = pm->pmf->set_resources_size;
266283 mutex_lock(&pm->lock);
267
- pm->priv_queue->ops.acquire_packet_buffer(pm->priv_queue,
284
+ kq_acquire_packet_buffer(pm->priv_queue,
268285 size / sizeof(uint32_t),
269286 (unsigned int **)&buffer);
270287 if (!buffer) {
....@@ -275,9 +292,9 @@
275292
276293 retval = pm->pmf->set_resources(pm, buffer, res);
277294 if (!retval)
278
- pm->priv_queue->ops.submit_packet(pm->priv_queue);
295
+ kq_submit_packet(pm->priv_queue);
279296 else
280
- pm->priv_queue->ops.rollback_packet(pm->priv_queue);
297
+ kq_rollback_packet(pm->priv_queue);
281298
282299 out:
283300 mutex_unlock(&pm->lock);
....@@ -302,7 +319,7 @@
302319 packet_size_dwords = pm->pmf->runlist_size / sizeof(uint32_t);
303320 mutex_lock(&pm->lock);
304321
305
- retval = pm->priv_queue->ops.acquire_packet_buffer(pm->priv_queue,
322
+ retval = kq_acquire_packet_buffer(pm->priv_queue,
306323 packet_size_dwords, &rl_buffer);
307324 if (retval)
308325 goto fail_acquire_packet_buffer;
....@@ -312,14 +329,14 @@
312329 if (retval)
313330 goto fail_create_runlist;
314331
315
- pm->priv_queue->ops.submit_packet(pm->priv_queue);
332
+ kq_submit_packet(pm->priv_queue);
316333
317334 mutex_unlock(&pm->lock);
318335
319336 return retval;
320337
321338 fail_create_runlist:
322
- pm->priv_queue->ops.rollback_packet(pm->priv_queue);
339
+ kq_rollback_packet(pm->priv_queue);
323340 fail_acquire_packet_buffer:
324341 mutex_unlock(&pm->lock);
325342 fail_create_runlist_ib:
....@@ -328,7 +345,7 @@
328345 }
329346
330347 int pm_send_query_status(struct packet_manager *pm, uint64_t fence_address,
331
- uint32_t fence_value)
348
+ uint64_t fence_value)
332349 {
333350 uint32_t *buffer, size;
334351 int retval = 0;
....@@ -338,7 +355,7 @@
338355
339356 size = pm->pmf->query_status_size;
340357 mutex_lock(&pm->lock);
341
- pm->priv_queue->ops.acquire_packet_buffer(pm->priv_queue,
358
+ kq_acquire_packet_buffer(pm->priv_queue,
342359 size / sizeof(uint32_t), (unsigned int **)&buffer);
343360 if (!buffer) {
344361 pr_err("Failed to allocate buffer on kernel queue\n");
....@@ -348,9 +365,9 @@
348365
349366 retval = pm->pmf->query_status(pm, buffer, fence_address, fence_value);
350367 if (!retval)
351
- pm->priv_queue->ops.submit_packet(pm->priv_queue);
368
+ kq_submit_packet(pm->priv_queue);
352369 else
353
- pm->priv_queue->ops.rollback_packet(pm->priv_queue);
370
+ kq_rollback_packet(pm->priv_queue);
354371
355372 out:
356373 mutex_unlock(&pm->lock);
....@@ -367,7 +384,7 @@
367384
368385 size = pm->pmf->unmap_queues_size;
369386 mutex_lock(&pm->lock);
370
- pm->priv_queue->ops.acquire_packet_buffer(pm->priv_queue,
387
+ kq_acquire_packet_buffer(pm->priv_queue,
371388 size / sizeof(uint32_t), (unsigned int **)&buffer);
372389 if (!buffer) {
373390 pr_err("Failed to allocate buffer on kernel queue\n");
....@@ -378,9 +395,9 @@
378395 retval = pm->pmf->unmap_queues(pm, buffer, type, filter, filter_param,
379396 reset, sdma_engine);
380397 if (!retval)
381
- pm->priv_queue->ops.submit_packet(pm->priv_queue);
398
+ kq_submit_packet(pm->priv_queue);
382399 else
383
- pm->priv_queue->ops.rollback_packet(pm->priv_queue);
400
+ kq_rollback_packet(pm->priv_queue);
384401
385402 out:
386403 mutex_unlock(&pm->lock);
....@@ -425,7 +442,7 @@
425442
426443 size = pm->pmf->query_status_size;
427444 mutex_lock(&pm->lock);
428
- pm->priv_queue->ops.acquire_packet_buffer(pm->priv_queue,
445
+ kq_acquire_packet_buffer(pm->priv_queue,
429446 size / sizeof(uint32_t), (unsigned int **)&buffer);
430447 if (!buffer) {
431448 pr_err("Failed to allocate buffer on kernel queue\n");
....@@ -433,7 +450,7 @@
433450 goto out;
434451 }
435452 memset(buffer, 0x55, size);
436
- pm->priv_queue->ops.submit_packet(pm->priv_queue);
453
+ kq_submit_packet(pm->priv_queue);
437454
438455 pr_info("Submitting %x %x %x %x %x %x %x to HIQ to hang the HWS.",
439456 buffer[0], buffer[1], buffer[2], buffer[3],