aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/amd/amdkfd/kfd_packet_manager.c91
1 files changed, 87 insertions, 4 deletions
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_packet_manager.c b/drivers/gpu/drm/amd/amdkfd/kfd_packet_manager.c
index e3230ccc46c7..90f391434fa3 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_packet_manager.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_packet_manager.c
@@ -182,6 +182,71 @@ static int pm_create_map_process(struct packet_manager *pm, uint32_t *buffer,
182 return 0; 182 return 0;
183} 183}
184 184
185static int pm_create_map_queue_vi(struct packet_manager *pm, uint32_t *buffer,
186 struct queue *q, bool is_static)
187{
188 struct pm4_mes_map_queues *packet;
189 bool use_static = is_static;
190
191 BUG_ON(!pm || !buffer || !q);
192
193 pr_debug("kfd: In func %s\n", __func__);
194
195 packet = (struct pm4_mes_map_queues *)buffer;
196 memset(buffer, 0, sizeof(struct pm4_map_queues));
197
198 packet->header.u32all = build_pm4_header(IT_MAP_QUEUES,
199 sizeof(struct pm4_map_queues));
200 packet->bitfields2.alloc_format =
201 alloc_format__mes_map_queues__one_per_pipe_vi;
202 packet->bitfields2.num_queues = 1;
203 packet->bitfields2.queue_sel =
204 queue_sel__mes_map_queues__map_to_hws_determined_queue_slots_vi;
205
206 packet->bitfields2.engine_sel =
207 engine_sel__mes_map_queues__compute_vi;
208 packet->bitfields2.queue_type =
209 queue_type__mes_map_queues__normal_compute_vi;
210
211 switch (q->properties.type) {
212 case KFD_QUEUE_TYPE_COMPUTE:
213 if (use_static)
214 packet->bitfields2.queue_type =
215 queue_type__mes_map_queues__normal_latency_static_queue_vi;
216 break;
217 case KFD_QUEUE_TYPE_DIQ:
218 packet->bitfields2.queue_type =
219 queue_type__mes_map_queues__debug_interface_queue_vi;
220 break;
221 case KFD_QUEUE_TYPE_SDMA:
222 packet->bitfields2.engine_sel =
223 engine_sel__mes_map_queues__sdma0_vi;
224 use_static = false; /* no static queues under SDMA */
225 break;
226 default:
227 pr_err("kfd: in %s queue type %d\n", __func__,
228 q->properties.type);
229 BUG();
230 break;
231 }
232 packet->bitfields3.doorbell_offset =
233 q->properties.doorbell_off;
234
235 packet->mqd_addr_lo =
236 lower_32_bits(q->gart_mqd_addr);
237
238 packet->mqd_addr_hi =
239 upper_32_bits(q->gart_mqd_addr);
240
241 packet->wptr_addr_lo =
242 lower_32_bits((uint64_t)q->properties.write_ptr);
243
244 packet->wptr_addr_hi =
245 upper_32_bits((uint64_t)q->properties.write_ptr);
246
247 return 0;
248}
249
185static int pm_create_map_queue(struct packet_manager *pm, uint32_t *buffer, 250static int pm_create_map_queue(struct packet_manager *pm, uint32_t *buffer,
186 struct queue *q, bool is_static) 251 struct queue *q, bool is_static)
187{ 252{
@@ -298,8 +363,17 @@ static int pm_create_runlist_ib(struct packet_manager *pm,
298 pr_debug("kfd: static_queue, mapping kernel q %d, is debug status %d\n", 363 pr_debug("kfd: static_queue, mapping kernel q %d, is debug status %d\n",
299 kq->queue->queue, qpd->is_debug); 364 kq->queue->queue, qpd->is_debug);
300 365
301 retval = pm_create_map_queue(pm, &rl_buffer[rl_wptr], 366 if (pm->dqm->dev->device_info->asic_family ==
302 kq->queue, qpd->is_debug); 367 CHIP_CARRIZO)
368 retval = pm_create_map_queue_vi(pm,
369 &rl_buffer[rl_wptr],
370 kq->queue,
371 qpd->is_debug);
372 else
373 retval = pm_create_map_queue(pm,
374 &rl_buffer[rl_wptr],
375 kq->queue,
376 qpd->is_debug);
303 if (retval != 0) 377 if (retval != 0)
304 return retval; 378 return retval;
305 379
@@ -315,8 +389,17 @@ static int pm_create_runlist_ib(struct packet_manager *pm,
315 pr_debug("kfd: static_queue, mapping user queue %d, is debug status %d\n", 389 pr_debug("kfd: static_queue, mapping user queue %d, is debug status %d\n",
316 q->queue, qpd->is_debug); 390 q->queue, qpd->is_debug);
317 391
318 retval = pm_create_map_queue(pm, &rl_buffer[rl_wptr], 392 if (pm->dqm->dev->device_info->asic_family ==
319 q, qpd->is_debug); 393 CHIP_CARRIZO)
394 retval = pm_create_map_queue_vi(pm,
395 &rl_buffer[rl_wptr],
396 q,
397 qpd->is_debug);
398 else
399 retval = pm_create_map_queue(pm,
400 &rl_buffer[rl_wptr],
401 q,
402 qpd->is_debug);
320 403
321 if (retval != 0) 404 if (retval != 0)
322 return retval; 405 return retval;