diff options
Diffstat (limited to 'drivers/gpu/drm/amd')
| -rw-r--r-- | drivers/gpu/drm/amd/amdkfd/kfd_packet_manager.c | 91 |
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 | ||
| 185 | static 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 | |||
| 185 | static int pm_create_map_queue(struct packet_manager *pm, uint32_t *buffer, | 250 | static 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; |
