hc
2023-12-11 d2ccde1c8e90d38cee87a1b0309ad2827f3fd30d
kernel/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_cik.c
....@@ -66,22 +66,33 @@
6666 m->compute_static_thread_mgmt_se3);
6767 }
6868
69
-static int init_mqd(struct mqd_manager *mm, void **mqd,
70
- struct kfd_mem_obj **mqd_mem_obj, uint64_t *gart_addr,
69
+static void set_priority(struct cik_mqd *m, struct queue_properties *q)
70
+{
71
+ m->cp_hqd_pipe_priority = pipe_priority_map[q->priority];
72
+ m->cp_hqd_queue_priority = q->priority;
73
+}
74
+
75
+static struct kfd_mem_obj *allocate_mqd(struct kfd_dev *kfd,
76
+ struct queue_properties *q)
77
+{
78
+ struct kfd_mem_obj *mqd_mem_obj;
79
+
80
+ if (kfd_gtt_sa_allocate(kfd, sizeof(struct cik_mqd),
81
+ &mqd_mem_obj))
82
+ return NULL;
83
+
84
+ return mqd_mem_obj;
85
+}
86
+
87
+static void init_mqd(struct mqd_manager *mm, void **mqd,
88
+ struct kfd_mem_obj *mqd_mem_obj, uint64_t *gart_addr,
7189 struct queue_properties *q)
7290 {
7391 uint64_t addr;
7492 struct cik_mqd *m;
75
- int retval;
7693
77
- retval = kfd_gtt_sa_allocate(mm->dev, sizeof(struct cik_mqd),
78
- mqd_mem_obj);
79
-
80
- if (retval != 0)
81
- return -ENOMEM;
82
-
83
- m = (struct cik_mqd *) (*mqd_mem_obj)->cpu_ptr;
84
- addr = (*mqd_mem_obj)->gpu_addr;
94
+ m = (struct cik_mqd *) mqd_mem_obj->cpu_ptr;
95
+ addr = mqd_mem_obj->gpu_addr;
8596
8697 memset(m, 0, ALIGN(sizeof(struct cik_mqd), 256));
8798
....@@ -116,8 +127,7 @@
116127 * 1 = CS_MEDIUM (typically between HP3D and GFX
117128 * 2 = CS_HIGH (typically above HP3D)
118129 */
119
- m->cp_hqd_pipe_priority = 1;
120
- m->cp_hqd_queue_priority = 15;
130
+ set_priority(m, q);
121131
122132 if (q->format == KFD_QUEUE_FORMAT_AQL)
123133 m->cp_hqd_iq_rptr = AQL_ENABLE;
....@@ -125,49 +135,32 @@
125135 *mqd = m;
126136 if (gart_addr)
127137 *gart_addr = addr;
128
- retval = mm->update_mqd(mm, m, q);
129
-
130
- return retval;
138
+ mm->update_mqd(mm, m, q);
131139 }
132140
133
-static int init_mqd_sdma(struct mqd_manager *mm, void **mqd,
134
- struct kfd_mem_obj **mqd_mem_obj, uint64_t *gart_addr,
141
+static void init_mqd_sdma(struct mqd_manager *mm, void **mqd,
142
+ struct kfd_mem_obj *mqd_mem_obj, uint64_t *gart_addr,
135143 struct queue_properties *q)
136144 {
137
- int retval;
138145 struct cik_sdma_rlc_registers *m;
139146
140
- retval = kfd_gtt_sa_allocate(mm->dev,
141
- sizeof(struct cik_sdma_rlc_registers),
142
- mqd_mem_obj);
143
-
144
- if (retval != 0)
145
- return -ENOMEM;
146
-
147
- m = (struct cik_sdma_rlc_registers *) (*mqd_mem_obj)->cpu_ptr;
147
+ m = (struct cik_sdma_rlc_registers *) mqd_mem_obj->cpu_ptr;
148148
149149 memset(m, 0, sizeof(struct cik_sdma_rlc_registers));
150150
151151 *mqd = m;
152152 if (gart_addr)
153
- *gart_addr = (*mqd_mem_obj)->gpu_addr;
153
+ *gart_addr = mqd_mem_obj->gpu_addr;
154154
155
- retval = mm->update_mqd(mm, m, q);
156
-
157
- return retval;
155
+ mm->update_mqd(mm, m, q);
158156 }
159157
160
-static void uninit_mqd(struct mqd_manager *mm, void *mqd,
158
+static void free_mqd(struct mqd_manager *mm, void *mqd,
161159 struct kfd_mem_obj *mqd_mem_obj)
162160 {
163161 kfd_gtt_sa_free(mm->dev, mqd_mem_obj);
164162 }
165163
166
-static void uninit_mqd_sdma(struct mqd_manager *mm, void *mqd,
167
- struct kfd_mem_obj *mqd_mem_obj)
168
-{
169
- kfd_gtt_sa_free(mm->dev, mqd_mem_obj);
170
-}
171164
172165 static int load_mqd(struct mqd_manager *mm, void *mqd, uint32_t pipe_id,
173166 uint32_t queue_id, struct queue_properties *p,
....@@ -191,7 +184,7 @@
191184 mms);
192185 }
193186
194
-static int __update_mqd(struct mqd_manager *mm, void *mqd,
187
+static void __update_mqd(struct mqd_manager *mm, void *mqd,
195188 struct queue_properties *q, unsigned int atc_bit)
196189 {
197190 struct cik_mqd *m;
....@@ -222,28 +215,24 @@
222215 m->cp_hqd_pq_control |= NO_UPDATE_RPTR;
223216
224217 update_cu_mask(mm, mqd, q);
218
+ set_priority(m, q);
225219
226
- q->is_active = (q->queue_size > 0 &&
227
- q->queue_address != 0 &&
228
- q->queue_percent > 0 &&
229
- !q->is_evicted);
230
-
231
- return 0;
220
+ q->is_active = QUEUE_IS_ACTIVE(*q);
232221 }
233222
234
-static int update_mqd(struct mqd_manager *mm, void *mqd,
223
+static void update_mqd(struct mqd_manager *mm, void *mqd,
235224 struct queue_properties *q)
236225 {
237
- return __update_mqd(mm, mqd, q, 1);
226
+ __update_mqd(mm, mqd, q, 1);
238227 }
239228
240
-static int update_mqd_hawaii(struct mqd_manager *mm, void *mqd,
229
+static void update_mqd_hawaii(struct mqd_manager *mm, void *mqd,
241230 struct queue_properties *q)
242231 {
243
- return __update_mqd(mm, mqd, q, 0);
232
+ __update_mqd(mm, mqd, q, 0);
244233 }
245234
246
-static int update_mqd_sdma(struct mqd_manager *mm, void *mqd,
235
+static void update_mqd_sdma(struct mqd_manager *mm, void *mqd,
247236 struct queue_properties *q)
248237 {
249238 struct cik_sdma_rlc_registers *m;
....@@ -267,12 +256,7 @@
267256 m->sdma_engine_id = q->sdma_engine_id;
268257 m->sdma_queue_id = q->sdma_queue_id;
269258
270
- q->is_active = (q->queue_size > 0 &&
271
- q->queue_address != 0 &&
272
- q->queue_percent > 0 &&
273
- !q->is_evicted);
274
-
275
- return 0;
259
+ q->is_active = QUEUE_IS_ACTIVE(*q);
276260 }
277261
278262 static int destroy_mqd(struct mqd_manager *mm, void *mqd,
....@@ -319,14 +303,14 @@
319303 * queues but with different initial values.
320304 */
321305
322
-static int init_mqd_hiq(struct mqd_manager *mm, void **mqd,
323
- struct kfd_mem_obj **mqd_mem_obj, uint64_t *gart_addr,
306
+static void init_mqd_hiq(struct mqd_manager *mm, void **mqd,
307
+ struct kfd_mem_obj *mqd_mem_obj, uint64_t *gart_addr,
324308 struct queue_properties *q)
325309 {
326
- return init_mqd(mm, mqd, mqd_mem_obj, gart_addr, q);
310
+ init_mqd(mm, mqd, mqd_mem_obj, gart_addr, q);
327311 }
328312
329
-static int update_mqd_hiq(struct mqd_manager *mm, void *mqd,
313
+static void update_mqd_hiq(struct mqd_manager *mm, void *mqd,
330314 struct queue_properties *q)
331315 {
332316 struct cik_mqd *m;
....@@ -350,12 +334,9 @@
350334
351335 m->cp_hqd_vmid = q->vmid;
352336
353
- q->is_active = (q->queue_size > 0 &&
354
- q->queue_address != 0 &&
355
- q->queue_percent > 0 &&
356
- !q->is_evicted);
337
+ q->is_active = QUEUE_IS_ACTIVE(*q);
357338
358
- return 0;
339
+ set_priority(m, q);
359340 }
360341
361342 #if defined(CONFIG_DEBUG_FS)
....@@ -393,35 +374,53 @@
393374
394375 switch (type) {
395376 case KFD_MQD_TYPE_CP:
396
- case KFD_MQD_TYPE_COMPUTE:
377
+ mqd->allocate_mqd = allocate_mqd;
397378 mqd->init_mqd = init_mqd;
398
- mqd->uninit_mqd = uninit_mqd;
379
+ mqd->free_mqd = free_mqd;
399380 mqd->load_mqd = load_mqd;
400381 mqd->update_mqd = update_mqd;
401382 mqd->destroy_mqd = destroy_mqd;
402383 mqd->is_occupied = is_occupied;
384
+ mqd->mqd_size = sizeof(struct cik_mqd);
403385 #if defined(CONFIG_DEBUG_FS)
404386 mqd->debugfs_show_mqd = debugfs_show_mqd;
405387 #endif
406388 break;
407389 case KFD_MQD_TYPE_HIQ:
390
+ mqd->allocate_mqd = allocate_hiq_mqd;
408391 mqd->init_mqd = init_mqd_hiq;
409
- mqd->uninit_mqd = uninit_mqd;
392
+ mqd->free_mqd = free_mqd_hiq_sdma;
410393 mqd->load_mqd = load_mqd;
411394 mqd->update_mqd = update_mqd_hiq;
412395 mqd->destroy_mqd = destroy_mqd;
413396 mqd->is_occupied = is_occupied;
397
+ mqd->mqd_size = sizeof(struct cik_mqd);
398
+#if defined(CONFIG_DEBUG_FS)
399
+ mqd->debugfs_show_mqd = debugfs_show_mqd;
400
+#endif
401
+ break;
402
+ case KFD_MQD_TYPE_DIQ:
403
+ mqd->allocate_mqd = allocate_mqd;
404
+ mqd->init_mqd = init_mqd_hiq;
405
+ mqd->free_mqd = free_mqd;
406
+ mqd->load_mqd = load_mqd;
407
+ mqd->update_mqd = update_mqd_hiq;
408
+ mqd->destroy_mqd = destroy_mqd;
409
+ mqd->is_occupied = is_occupied;
410
+ mqd->mqd_size = sizeof(struct cik_mqd);
414411 #if defined(CONFIG_DEBUG_FS)
415412 mqd->debugfs_show_mqd = debugfs_show_mqd;
416413 #endif
417414 break;
418415 case KFD_MQD_TYPE_SDMA:
416
+ mqd->allocate_mqd = allocate_sdma_mqd;
419417 mqd->init_mqd = init_mqd_sdma;
420
- mqd->uninit_mqd = uninit_mqd_sdma;
418
+ mqd->free_mqd = free_mqd_hiq_sdma;
421419 mqd->load_mqd = load_mqd_sdma;
422420 mqd->update_mqd = update_mqd_sdma;
423421 mqd->destroy_mqd = destroy_mqd_sdma;
424422 mqd->is_occupied = is_occupied_sdma;
423
+ mqd->mqd_size = sizeof(struct cik_sdma_rlc_registers);
425424 #if defined(CONFIG_DEBUG_FS)
426425 mqd->debugfs_show_mqd = debugfs_show_mqd_sdma;
427426 #endif
....@@ -442,7 +441,7 @@
442441 mqd = mqd_manager_init_cik(type, dev);
443442 if (!mqd)
444443 return NULL;
445
- if ((type == KFD_MQD_TYPE_CP) || (type == KFD_MQD_TYPE_COMPUTE))
444
+ if (type == KFD_MQD_TYPE_CP)
446445 mqd->update_mqd = update_mqd_hawaii;
447446 return mqd;
448447 }