forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-05-13 9d77db3c730780c8ef5ccd4b66403ff5675cfe4e
kernel/drivers/gpu/drm/amd/amdkfd/kfd_process_queue_manager.c
....@@ -26,6 +26,7 @@
2626 #include "kfd_device_queue_manager.h"
2727 #include "kfd_priv.h"
2828 #include "kfd_kernel_queue.h"
29
+#include "amdgpu_amdkfd.h"
2930
3031 static inline struct process_queue_node *get_queue_by_qid(
3132 struct process_queue_manager *pqm, unsigned int qid)
....@@ -52,7 +53,7 @@
5253 pr_debug("The new slot id %lu\n", found);
5354
5455 if (found >= KFD_MAX_NUM_OF_QUEUES_PER_PROCESS) {
55
- pr_info("Cannot open more queues for process with pasid %d\n",
56
+ pr_info("Cannot open more queues for process with pasid 0x%x\n",
5657 pqm->process->pasid);
5758 return -ENOMEM;
5859 }
....@@ -72,6 +73,55 @@
7273
7374 dev->dqm->ops.process_termination(dev->dqm, &pdd->qpd);
7475 pdd->already_dequeued = true;
76
+}
77
+
78
+int pqm_set_gws(struct process_queue_manager *pqm, unsigned int qid,
79
+ void *gws)
80
+{
81
+ struct kfd_dev *dev = NULL;
82
+ struct process_queue_node *pqn;
83
+ struct kfd_process_device *pdd;
84
+ struct kgd_mem *mem = NULL;
85
+ int ret;
86
+
87
+ pqn = get_queue_by_qid(pqm, qid);
88
+ if (!pqn) {
89
+ pr_err("Queue id does not match any known queue\n");
90
+ return -EINVAL;
91
+ }
92
+
93
+ if (pqn->q)
94
+ dev = pqn->q->device;
95
+ if (WARN_ON(!dev))
96
+ return -ENODEV;
97
+
98
+ pdd = kfd_get_process_device_data(dev, pqm->process);
99
+ if (!pdd) {
100
+ pr_err("Process device data doesn't exist\n");
101
+ return -EINVAL;
102
+ }
103
+
104
+ /* Only allow one queue per process can have GWS assigned */
105
+ if (gws && pdd->qpd.num_gws)
106
+ return -EBUSY;
107
+
108
+ if (!gws && pdd->qpd.num_gws == 0)
109
+ return -EINVAL;
110
+
111
+ if (gws)
112
+ ret = amdgpu_amdkfd_add_gws_to_process(pdd->process->kgd_process_info,
113
+ gws, &mem);
114
+ else
115
+ ret = amdgpu_amdkfd_remove_gws_from_process(pdd->process->kgd_process_info,
116
+ pqn->q->gws);
117
+ if (unlikely(ret))
118
+ return ret;
119
+
120
+ pqn->q->gws = mem;
121
+ pdd->qpd.num_gws = gws ? amdgpu_amdkfd_get_num_gws(dev->kgd) : 0;
122
+
123
+ return pqn->q->device->dqm->ops.update_queue(pqn->q->device->dqm,
124
+ pqn->q);
75125 }
76126
77127 void kfd_process_dequeue_from_all_devices(struct kfd_process *p)
....@@ -100,6 +150,10 @@
100150 struct process_queue_node *pqn, *next;
101151
102152 list_for_each_entry_safe(pqn, next, &pqm->queues, process_queue_list) {
153
+ if (pqn->q && pqn->q->gws)
154
+ amdgpu_amdkfd_remove_gws_from_process(pqm->process->kgd_process_info,
155
+ pqn->q->gws);
156
+ kfd_procfs_del_queue(pqn->q);
103157 uninit_queue(pqn->q);
104158 list_del(&pqn->process_queue_list);
105159 kfree(pqn);
....@@ -109,7 +163,7 @@
109163 pqm->queue_slot_bitmap = NULL;
110164 }
111165
112
-static int create_cp_queue(struct process_queue_manager *pqm,
166
+static int init_user_queue(struct process_queue_manager *pqm,
113167 struct kfd_dev *dev, struct queue **q,
114168 struct queue_properties *q_properties,
115169 struct file *f, unsigned int qid)
....@@ -139,7 +193,8 @@
139193 struct kfd_dev *dev,
140194 struct file *f,
141195 struct queue_properties *properties,
142
- unsigned int *qid)
196
+ unsigned int *qid,
197
+ uint32_t *p_doorbell_offset_in_process)
143198 {
144199 int retval;
145200 struct kfd_process_device *pdd;
....@@ -186,19 +241,19 @@
186241
187242 switch (type) {
188243 case KFD_QUEUE_TYPE_SDMA:
189
- if (dev->dqm->queue_count >= get_num_sdma_queues(dev->dqm)) {
190
- pr_err("Over-subscription is not allowed for SDMA.\n");
191
- retval = -EPERM;
192
- goto err_create_queue;
193
- }
194
-
195
- retval = create_cp_queue(pqm, dev, &q, properties, f, *qid);
244
+ case KFD_QUEUE_TYPE_SDMA_XGMI:
245
+ /* SDMA queues are always allocated statically no matter
246
+ * which scheduler mode is used. We also do not need to
247
+ * check whether a SDMA queue can be allocated here, because
248
+ * allocate_sdma_queue() in create_queue() has the
249
+ * corresponding check logic.
250
+ */
251
+ retval = init_user_queue(pqm, dev, &q, properties, f, *qid);
196252 if (retval != 0)
197253 goto err_create_queue;
198254 pqn->q = q;
199255 pqn->kq = NULL;
200256 retval = dev->dqm->ops.create_queue(dev->dqm, q, &pdd->qpd);
201
- pr_debug("DQM returned %d for create_queue\n", retval);
202257 print_queue(q);
203258 break;
204259
....@@ -207,19 +262,18 @@
207262 if ((dev->dqm->sched_policy ==
208263 KFD_SCHED_POLICY_HWS_NO_OVERSUBSCRIPTION) &&
209264 ((dev->dqm->processes_count >= dev->vm_info.vmid_num_kfd) ||
210
- (dev->dqm->queue_count >= get_queues_num(dev->dqm)))) {
265
+ (dev->dqm->active_queue_count >= get_cp_queues_num(dev->dqm)))) {
211266 pr_debug("Over-subscription is not allowed when amdkfd.sched_policy == 1\n");
212267 retval = -EPERM;
213268 goto err_create_queue;
214269 }
215270
216
- retval = create_cp_queue(pqm, dev, &q, properties, f, *qid);
271
+ retval = init_user_queue(pqm, dev, &q, properties, f, *qid);
217272 if (retval != 0)
218273 goto err_create_queue;
219274 pqn->q = q;
220275 pqn->kq = NULL;
221276 retval = dev->dqm->ops.create_queue(dev->dqm, q, &pdd->qpd);
222
- pr_debug("DQM returned %d for create_queue\n", retval);
223277 print_queue(q);
224278 break;
225279 case KFD_QUEUE_TYPE_DIQ:
....@@ -240,17 +294,20 @@
240294 }
241295
242296 if (retval != 0) {
243
- pr_err("Pasid %d DQM create queue %d failed. ret %d\n",
297
+ pr_err("Pasid 0x%x DQM create queue type %d failed. ret %d\n",
244298 pqm->process->pasid, type, retval);
245299 goto err_create_queue;
246300 }
247301
248
- if (q)
302
+ if (q && p_doorbell_offset_in_process)
249303 /* Return the doorbell offset within the doorbell page
250304 * to the caller so it can be passed up to user mode
251305 * (in bytes).
306
+ * There are always 1024 doorbells per process, so in case
307
+ * of 8-byte doorbells, there are two doorbell pages per
308
+ * process.
252309 */
253
- properties->doorbell_off =
310
+ *p_doorbell_offset_in_process =
254311 (q->properties.doorbell_off * sizeof(uint32_t)) &
255312 (kfd_doorbell_process_slice(dev) - 1);
256313
....@@ -260,12 +317,16 @@
260317
261318 if (q) {
262319 pr_debug("PQM done creating queue\n");
320
+ kfd_procfs_add_queue(q);
263321 print_queue_properties(&q->properties);
264322 }
265323
266324 return retval;
267325
268326 err_create_queue:
327
+ uninit_queue(q);
328
+ if (kq)
329
+ kernel_queue_uninit(kq, false);
269330 kfree(pqn);
270331 err_allocate_pqn:
271332 /* check if queues list is empty unregister process from device */
....@@ -312,19 +373,27 @@
312373 /* destroy kernel queue (DIQ) */
313374 dqm = pqn->kq->dev->dqm;
314375 dqm->ops.destroy_kernel_queue(dqm, pqn->kq, &pdd->qpd);
315
- kernel_queue_uninit(pqn->kq);
376
+ kernel_queue_uninit(pqn->kq, false);
316377 }
317378
318379 if (pqn->q) {
380
+ kfd_procfs_del_queue(pqn->q);
319381 dqm = pqn->q->device->dqm;
320382 retval = dqm->ops.destroy_queue(dqm, &pdd->qpd, pqn->q);
321383 if (retval) {
322
- pr_err("Pasid %d destroy queue %d failed, ret %d\n",
384
+ pr_err("Pasid 0x%x destroy queue %d failed, ret %d\n",
323385 pqm->process->pasid,
324386 pqn->q->properties.queue_id, retval);
325387 if (retval != -ETIME)
326388 goto err_destroy_queue;
327389 }
390
+
391
+ if (pqn->q->gws) {
392
+ amdgpu_amdkfd_remove_gws_from_process(pqm->process->kgd_process_info,
393
+ pqn->q->gws);
394
+ pdd->qpd.num_gws = 0;
395
+ }
396
+
328397 kfree(pqn->q->properties.cu_mask);
329398 pqn->q->properties.cu_mask = NULL;
330399 uninit_queue(pqn->q);
....@@ -408,6 +477,37 @@
408477 return NULL;
409478 }
410479
480
+struct queue *pqm_get_user_queue(struct process_queue_manager *pqm,
481
+ unsigned int qid)
482
+{
483
+ struct process_queue_node *pqn;
484
+
485
+ pqn = get_queue_by_qid(pqm, qid);
486
+ return pqn ? pqn->q : NULL;
487
+}
488
+
489
+int pqm_get_wave_state(struct process_queue_manager *pqm,
490
+ unsigned int qid,
491
+ void __user *ctl_stack,
492
+ u32 *ctl_stack_used_size,
493
+ u32 *save_area_used_size)
494
+{
495
+ struct process_queue_node *pqn;
496
+
497
+ pqn = get_queue_by_qid(pqm, qid);
498
+ if (!pqn) {
499
+ pr_debug("amdkfd: No queue %d exists for operation\n",
500
+ qid);
501
+ return -EFAULT;
502
+ }
503
+
504
+ return pqn->q->device->dqm->ops.get_wave_state(pqn->q->device->dqm,
505
+ pqn->q,
506
+ ctl_stack,
507
+ ctl_stack_used_size,
508
+ save_area_used_size);
509
+}
510
+
411511 #if defined(CONFIG_DEBUG_FS)
412512
413513 int pqm_debugfs_mqds(struct seq_file *m, void *data)
....@@ -424,6 +524,7 @@
424524 q = pqn->q;
425525 switch (q->properties.type) {
426526 case KFD_QUEUE_TYPE_SDMA:
527
+ case KFD_QUEUE_TYPE_SDMA_XGMI:
427528 seq_printf(m, " SDMA queue on device %x\n",
428529 q->device->id);
429530 mqd_type = KFD_MQD_TYPE_SDMA;
....@@ -439,8 +540,7 @@
439540 q->properties.type, q->device->id);
440541 continue;
441542 }
442
- mqd_mgr = q->device->dqm->ops.get_mqd_manager(
443
- q->device->dqm, mqd_type);
543
+ mqd_mgr = q->device->dqm->mqd_mgrs[mqd_type];
444544 } else if (pqn->kq) {
445545 q = pqn->kq->queue;
446546 mqd_mgr = pqn->kq->mqd_mgr;
....@@ -448,7 +548,6 @@
448548 case KFD_QUEUE_TYPE_DIQ:
449549 seq_printf(m, " DIQ on device %x\n",
450550 pqn->kq->dev->id);
451
- mqd_type = KFD_MQD_TYPE_HIQ;
452551 break;
453552 default:
454553 seq_printf(m,