1 // SPDX-License-Identifier: MIT 2 /* 3 * Copyright 2023 Advanced Micro Devices, Inc. 4 * 5 * Permission is hereby granted, free of charge, to any person obtaining a 6 * copy of this software and associated documentation files (the "Software"), 7 * to deal in the Software without restriction, including without limitation 8 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 9 * and/or sell copies of the Software, and to permit persons to whom the 10 * Software is furnished to do so, subject to the following conditions: 11 * 12 * The above copyright notice and this permission notice shall be included in 13 * all copies or substantial portions of the Software. 14 * 15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 19 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 20 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 21 * OTHER DEALINGS IN THE SOFTWARE. 22 * 23 */ 24 25 #include <drm/drm_auth.h> 26 #include <drm/drm_exec.h> 27 #include <linux/pm_runtime.h> 28 #include <drm/drm_drv.h> 29 30 #include "amdgpu.h" 31 #include "amdgpu_reset.h" 32 #include "amdgpu_vm.h" 33 #include "amdgpu_userq.h" 34 #include "amdgpu_hmm.h" 35 #include "amdgpu_userq_fence.h" 36 #include "amdgpu_trace.h" 37 38 u32 amdgpu_userq_get_supported_ip_mask(struct amdgpu_device *adev) 39 { 40 int i; 41 u32 userq_ip_mask = 0; 42 43 for (i = 0; i < AMDGPU_HW_IP_NUM; i++) { 44 if (adev->userq_funcs[i]) 45 userq_ip_mask |= (1 << i); 46 } 47 48 return userq_ip_mask; 49 } 50 51 static bool amdgpu_userq_is_reset_type_supported(struct amdgpu_device *adev, 52 enum amdgpu_ring_type ring_type, int reset_type) 53 { 54 55 if (ring_type < 0 || ring_type >= AMDGPU_RING_TYPE_MAX) 56 return false; 57 58 switch (ring_type) { 59 case AMDGPU_RING_TYPE_GFX: 60 if (adev->gfx.gfx_supported_reset & reset_type) 61 return true; 62 break; 63 case AMDGPU_RING_TYPE_COMPUTE: 64 if (adev->gfx.compute_supported_reset & reset_type) 65 return true; 66 break; 67 case AMDGPU_RING_TYPE_SDMA: 68 if (adev->sdma.supported_reset & reset_type) 69 return true; 70 break; 71 case AMDGPU_RING_TYPE_VCN_DEC: 72 case AMDGPU_RING_TYPE_VCN_ENC: 73 if (adev->vcn.supported_reset & reset_type) 74 return true; 75 break; 76 case AMDGPU_RING_TYPE_VCN_JPEG: 77 if (adev->jpeg.supported_reset & reset_type) 78 return true; 79 break; 80 default: 81 break; 82 } 83 return false; 84 } 85 86 static void amdgpu_userq_mgr_reset_work(struct work_struct *work) 87 { 88 struct amdgpu_userq_mgr *uq_mgr = 89 container_of(work, struct amdgpu_userq_mgr, 90 reset_work); 91 struct amdgpu_device *adev = uq_mgr->adev; 92 struct amdgpu_reset_context reset_context; 93 94 if (unlikely(adev->debug_disable_gpu_ring_reset)) { 95 dev_err(adev->dev, "userq reset disabled by debug mask\n"); 96 return; 97 } 98 99 /* 100 * If GPU recovery feature is disabled system-wide, 101 * skip all reset detection logic 102 */ 103 if (!amdgpu_gpu_recovery) 104 return; 105 106 memset(&reset_context, 0, sizeof(reset_context)); 107 108 reset_context.method = AMD_RESET_METHOD_NONE; 109 reset_context.reset_req_dev = adev; 110 reset_context.src = AMDGPU_RESET_SRC_USERQ; 111 set_bit(AMDGPU_NEED_FULL_RESET, &reset_context.flags); 112 /*set_bit(AMDGPU_SKIP_COREDUMP, &reset_context.flags);*/ 113 114 amdgpu_device_gpu_recover(adev, NULL, &reset_context); 115 } 116 117 static void amdgpu_userq_hang_detect_work(struct work_struct *work) 118 { 119 struct amdgpu_usermode_queue *queue = 120 container_of(work, struct amdgpu_usermode_queue, 121 hang_detect_work.work); 122 struct amdgpu_userq_mgr *uq_mgr = queue->userq_mgr; 123 struct amdgpu_device *adev = uq_mgr->adev; 124 const struct amdgpu_userq_funcs *userq_funcs = 125 adev->userq_funcs[queue->queue_type]; 126 bool gpu_reset = false; 127 128 if (unlikely(adev->debug_disable_gpu_ring_reset)) { 129 dev_err(adev->dev, "userq reset disabled by debug mask\n"); 130 return; 131 } 132 133 /* 134 * If GPU recovery feature is disabled system-wide, 135 * skip all reset detection logic 136 */ 137 if (!amdgpu_gpu_recovery) 138 return; 139 140 if (amdgpu_userq_is_reset_type_supported(adev, queue->queue_type, 141 AMDGPU_RESET_TYPE_PER_QUEUE)) { 142 int r; 143 144 if (queue->queue_type == AMDGPU_HW_IP_COMPUTE) 145 r = amdgpu_gfx_reset_mes_compute(adev, NULL, NULL, 146 queue, NULL, NULL); 147 else 148 r = userq_funcs->reset(queue); 149 if (r) 150 gpu_reset = true; 151 } else { 152 gpu_reset = true; 153 } 154 155 /* 156 * Don't schedule the work here! Scheduling or queue work from one reset 157 * handler to another is illegal if you don't take extra precautions! 158 */ 159 if (gpu_reset) 160 amdgpu_userq_mgr_reset_work(&queue->userq_mgr->reset_work); 161 } 162 163 /* 164 * Start hang detection for a user queue fence. A delayed work will be scheduled 165 * to reset the queues when the fence doesn't signal in time. 166 */ 167 void amdgpu_userq_start_hang_detect_work(struct amdgpu_usermode_queue *queue) 168 { 169 struct amdgpu_device *adev; 170 unsigned long timeout_ms; 171 172 adev = queue->userq_mgr->adev; 173 /* Determine timeout based on queue type */ 174 switch (queue->queue_type) { 175 case AMDGPU_RING_TYPE_GFX: 176 timeout_ms = adev->gfx_timeout; 177 break; 178 case AMDGPU_RING_TYPE_COMPUTE: 179 timeout_ms = adev->compute_timeout; 180 break; 181 case AMDGPU_RING_TYPE_SDMA: 182 timeout_ms = adev->sdma_timeout; 183 break; 184 default: 185 timeout_ms = adev->gfx_timeout; 186 break; 187 } 188 189 queue_delayed_work(adev->reset_domain->wq, &queue->hang_detect_work, 190 msecs_to_jiffies(timeout_ms)); 191 } 192 193 void amdgpu_userq_process_fence_irq(struct amdgpu_device *adev, u32 doorbell) 194 { 195 struct xarray *xa = &adev->userq_doorbell_xa; 196 struct amdgpu_usermode_queue *queue; 197 unsigned long flags; 198 int r; 199 200 xa_lock_irqsave(xa, flags); 201 queue = xa_load(xa, doorbell); 202 if (queue) { 203 r = amdgpu_userq_fence_driver_process(queue->fence_drv); 204 /* 205 * We are in interrupt context here, this *can't* wait for 206 * reset work to finish. 207 */ 208 if (r >= 0) 209 cancel_delayed_work(&queue->hang_detect_work); 210 211 /* Restart the timer when there are still fences pending */ 212 if (r == 1) 213 amdgpu_userq_start_hang_detect_work(queue); 214 } 215 xa_unlock_irqrestore(xa, flags); 216 } 217 218 int amdgpu_userq_input_va_validate(struct amdgpu_device *adev, 219 struct amdgpu_usermode_queue *queue, 220 u64 addr, u64 expected_size, 221 u64 *va_out) 222 { 223 struct amdgpu_bo_va_mapping *va_map; 224 struct amdgpu_vm *vm = queue->vm; 225 u64 user_addr; 226 u64 size; 227 228 /* Caller must hold vm->root.bo reservation */ 229 dma_resv_assert_held(queue->vm->root.bo->tbo.base.resv); 230 231 user_addr = (addr & AMDGPU_GMC_HOLE_MASK) >> AMDGPU_GPU_PAGE_SHIFT; 232 size = expected_size >> AMDGPU_GPU_PAGE_SHIFT; 233 234 va_map = amdgpu_vm_bo_lookup_mapping(vm, user_addr); 235 if (!va_map) 236 return -EINVAL; 237 238 /* Only validate the userq whether resident in the VM mapping range */ 239 if (user_addr >= va_map->start && 240 va_map->last - user_addr + 1 >= size) { 241 va_map->bo_va->userq_va_mapped = true; 242 *va_out = user_addr; 243 return 0; 244 } 245 246 return -EINVAL; 247 } 248 249 static bool amdgpu_userq_buffer_va_mapped(struct amdgpu_vm *vm, u64 addr) 250 { 251 struct amdgpu_bo_va_mapping *mapping; 252 bool r; 253 254 dma_resv_assert_held(vm->root.bo->tbo.base.resv); 255 256 mapping = amdgpu_vm_bo_lookup_mapping(vm, addr); 257 if (!IS_ERR_OR_NULL(mapping) && mapping->bo_va->userq_va_mapped) 258 r = true; 259 else 260 r = false; 261 262 return r; 263 } 264 265 static bool amdgpu_userq_buffer_vas_mapped(struct amdgpu_usermode_queue *queue) 266 { 267 int i, r = 0; 268 269 for (i = 0; i < ARRAY_SIZE(queue->userq_vas.va_array); i++) { 270 if (!queue->userq_vas.va_array[i]) 271 continue; 272 r += amdgpu_userq_buffer_va_mapped(queue->vm, 273 queue->userq_vas.va_array[i]); 274 dev_dbg(queue->userq_mgr->adev->dev, 275 "validate the userq mapping:%p va:%llx r:%d\n", 276 queue, queue->userq_vas.va_array[i], r); 277 } 278 279 if (r != 0) 280 return true; 281 282 return false; 283 } 284 285 286 287 static int amdgpu_userq_preempt_helper(struct amdgpu_usermode_queue *queue) 288 { 289 struct amdgpu_userq_mgr *uq_mgr = queue->userq_mgr; 290 struct amdgpu_device *adev = uq_mgr->adev; 291 const struct amdgpu_userq_funcs *userq_funcs = 292 adev->userq_funcs[queue->queue_type]; 293 int r; 294 295 if (queue->state == AMDGPU_USERQ_STATE_MAPPED) { 296 trace_amdgpu_userq_state_start(queue); 297 298 r = userq_funcs->preempt(queue); 299 if (r) { 300 trace_amdgpu_userq_state_changed(queue, AMDGPU_USERQ_STATE_HUNG); 301 queue->state = AMDGPU_USERQ_STATE_HUNG; 302 return r; 303 } else { 304 trace_amdgpu_userq_state_changed(queue, AMDGPU_USERQ_STATE_PREEMPTED); 305 queue->state = AMDGPU_USERQ_STATE_PREEMPTED; 306 } 307 } 308 return 0; 309 } 310 311 static int amdgpu_userq_restore_helper(struct amdgpu_usermode_queue *queue) 312 { 313 struct amdgpu_userq_mgr *uq_mgr = queue->userq_mgr; 314 struct amdgpu_device *adev = uq_mgr->adev; 315 const struct amdgpu_userq_funcs *userq_funcs = 316 adev->userq_funcs[queue->queue_type]; 317 int r = 0; 318 319 if (queue->state == AMDGPU_USERQ_STATE_PREEMPTED) { 320 trace_amdgpu_userq_state_start(queue); 321 322 r = userq_funcs->restore(queue); 323 if (r) { 324 trace_amdgpu_userq_state_changed(queue, AMDGPU_USERQ_STATE_HUNG); 325 queue->state = AMDGPU_USERQ_STATE_HUNG; 326 } else { 327 trace_amdgpu_userq_state_changed(queue, AMDGPU_USERQ_STATE_MAPPED); 328 queue->state = AMDGPU_USERQ_STATE_MAPPED; 329 } 330 } 331 332 return r; 333 } 334 335 static int amdgpu_userq_unmap_helper(struct amdgpu_usermode_queue *queue) 336 { 337 struct amdgpu_userq_mgr *uq_mgr = queue->userq_mgr; 338 struct amdgpu_device *adev = uq_mgr->adev; 339 const struct amdgpu_userq_funcs *userq_funcs = 340 adev->userq_funcs[queue->queue_type]; 341 int r; 342 343 if ((queue->state == AMDGPU_USERQ_STATE_MAPPED) || 344 (queue->state == AMDGPU_USERQ_STATE_PREEMPTED)) { 345 trace_amdgpu_userq_state_start(queue); 346 347 r = userq_funcs->unmap(queue); 348 if (r) { 349 trace_amdgpu_userq_state_changed(queue, AMDGPU_USERQ_STATE_HUNG); 350 queue->state = AMDGPU_USERQ_STATE_HUNG; 351 return r; 352 } else { 353 trace_amdgpu_userq_state_changed(queue, AMDGPU_USERQ_STATE_UNMAPPED); 354 queue->state = AMDGPU_USERQ_STATE_UNMAPPED; 355 } 356 } 357 358 return 0; 359 } 360 361 static int amdgpu_userq_map_helper(struct amdgpu_usermode_queue *queue) 362 { 363 struct amdgpu_userq_mgr *uq_mgr = queue->userq_mgr; 364 struct amdgpu_device *adev = uq_mgr->adev; 365 const struct amdgpu_userq_funcs *userq_funcs = 366 adev->userq_funcs[queue->queue_type]; 367 int r; 368 369 if (queue->state == AMDGPU_USERQ_STATE_UNMAPPED) { 370 trace_amdgpu_userq_state_start(queue); 371 372 r = userq_funcs->map(queue); 373 if (r) { 374 trace_amdgpu_userq_state_changed(queue, AMDGPU_USERQ_STATE_HUNG); 375 queue->state = AMDGPU_USERQ_STATE_HUNG; 376 return r; 377 } else { 378 trace_amdgpu_userq_state_changed(queue, AMDGPU_USERQ_STATE_MAPPED); 379 queue->state = AMDGPU_USERQ_STATE_MAPPED; 380 } 381 } 382 383 return 0; 384 } 385 386 static void amdgpu_userq_wait_for_last_fence(struct amdgpu_usermode_queue *queue) 387 { 388 struct dma_fence *f = queue->last_fence; 389 390 if (!f) 391 return; 392 393 dma_fence_wait(f, false); 394 } 395 396 static void amdgpu_userq_cleanup(struct amdgpu_usermode_queue *queue) 397 { 398 struct amdgpu_userq_mgr *uq_mgr = queue->userq_mgr; 399 struct amdgpu_device *adev = uq_mgr->adev; 400 401 /* Wait for mode-1 reset to complete */ 402 down_read(&adev->reset_domain->sem); 403 404 /* Use interrupt-safe locking since IRQ handlers may access these XArrays */ 405 xa_erase_irq(&adev->userq_doorbell_xa, queue->doorbell_index); 406 amdgpu_userq_fence_driver_free(queue); 407 queue->fence_drv = NULL; 408 409 up_read(&adev->reset_domain->sem); 410 } 411 412 /** 413 * amdgpu_userq_ensure_ev_fence - ensure a valid, unsignaled eviction fence exists 414 * @uq_mgr: the usermode queue manager for this process 415 * @evf_mgr: the eviction fence manager to check and rearm 416 * 417 * Ensures that a valid and not yet signaled eviction fence is attached to the 418 * usermode queue before any queue operations proceed. If it is signalled, then 419 * rearm a new eviction fence. 420 */ 421 void 422 amdgpu_userq_ensure_ev_fence(struct amdgpu_userq_mgr *uq_mgr, 423 struct amdgpu_eviction_fence_mgr *evf_mgr) 424 { 425 struct dma_fence *ev_fence; 426 427 retry: 428 /* Flush any pending resume work to create ev_fence */ 429 flush_delayed_work(&uq_mgr->resume_work); 430 431 mutex_lock(&uq_mgr->userq_mutex); 432 ev_fence = amdgpu_evf_mgr_get_fence(evf_mgr); 433 if (dma_fence_is_signaled(ev_fence)) { 434 dma_fence_put(ev_fence); 435 mutex_unlock(&uq_mgr->userq_mutex); 436 /* 437 * Looks like there was no pending resume work, 438 * add one now to create a valid eviction fence 439 */ 440 schedule_delayed_work(&uq_mgr->resume_work, 0); 441 goto retry; 442 } 443 dma_fence_put(ev_fence); 444 } 445 446 447 448 static int 449 amdgpu_userq_get_doorbell_index(struct amdgpu_userq_mgr *uq_mgr, 450 struct amdgpu_db_info *db_info, 451 struct drm_file *filp, 452 u64 *index) 453 { 454 u64 doorbell_index; 455 struct drm_gem_object *gobj; 456 struct amdgpu_userq_obj *db_obj = db_info->db_obj; 457 int r, db_size; 458 459 gobj = drm_gem_object_lookup(filp, db_info->doorbell_handle); 460 if (gobj == NULL) { 461 drm_file_err(uq_mgr->file, "Can't find GEM object for doorbell\n"); 462 return -EINVAL; 463 } 464 465 db_obj->obj = amdgpu_bo_ref(gem_to_amdgpu_bo(gobj)); 466 drm_gem_object_put(gobj); 467 468 r = amdgpu_bo_reserve(db_obj->obj, true); 469 if (r) { 470 drm_file_err(uq_mgr->file, "[Usermode queues] Failed to pin doorbell object\n"); 471 goto unref_bo; 472 } 473 474 /* Pin the BO before generating the index, unpin in queue destroy */ 475 r = amdgpu_bo_pin(db_obj->obj, AMDGPU_GEM_DOMAIN_DOORBELL); 476 if (r) { 477 drm_file_err(uq_mgr->file, "[Usermode queues] Failed to pin doorbell object\n"); 478 goto unresv_bo; 479 } 480 481 switch (db_info->queue_type) { 482 case AMDGPU_HW_IP_GFX: 483 case AMDGPU_HW_IP_COMPUTE: 484 case AMDGPU_HW_IP_DMA: 485 db_size = sizeof(u64); 486 break; 487 default: 488 drm_file_err(uq_mgr->file, "[Usermode queues] IP %d not support\n", 489 db_info->queue_type); 490 r = -EINVAL; 491 goto unpin_bo; 492 } 493 494 /* Validate doorbell_offset is within the doorbell BO */ 495 if ((u64)db_info->doorbell_offset * db_size + db_size > 496 amdgpu_bo_size(db_obj->obj)) { 497 r = -EINVAL; 498 goto unpin_bo; 499 } 500 501 doorbell_index = amdgpu_doorbell_index_on_bar(uq_mgr->adev, db_obj->obj, 502 db_info->doorbell_offset, db_size); 503 drm_dbg_driver(adev_to_drm(uq_mgr->adev), 504 "[Usermode queues] doorbell index=%lld\n", doorbell_index); 505 amdgpu_bo_unreserve(db_obj->obj); 506 *index = doorbell_index; 507 return 0; 508 509 unpin_bo: 510 amdgpu_bo_unpin(db_obj->obj); 511 unresv_bo: 512 amdgpu_bo_unreserve(db_obj->obj); 513 unref_bo: 514 amdgpu_bo_unref(&db_obj->obj); 515 return r; 516 } 517 518 static int 519 amdgpu_userq_destroy(struct amdgpu_userq_mgr *uq_mgr, struct amdgpu_usermode_queue *queue) 520 { 521 struct amdgpu_device *adev = uq_mgr->adev; 522 const struct amdgpu_userq_funcs *uq_funcs = adev->userq_funcs[queue->queue_type]; 523 int r = 0; 524 525 trace_amdgpu_userq_destroy_start(queue); 526 527 cancel_delayed_work_sync(&uq_mgr->resume_work); 528 529 /* Cancel any pending hang detection work and cleanup */ 530 cancel_delayed_work_sync(&queue->hang_detect_work); 531 532 mutex_lock(&uq_mgr->userq_mutex); 533 amdgpu_userq_wait_for_last_fence(queue); 534 535 #if defined(CONFIG_DEBUG_FS) 536 debugfs_remove_recursive(queue->debugfs_queue); 537 #endif 538 r = amdgpu_userq_unmap_helper(queue); 539 atomic_dec(&uq_mgr->userq_count[queue->queue_type]); 540 amdgpu_userq_cleanup(queue); 541 mutex_unlock(&uq_mgr->userq_mutex); 542 543 cancel_delayed_work_sync(&queue->hang_detect_work); 544 uq_funcs->mqd_destroy(queue); 545 queue->userq_mgr = NULL; 546 547 amdgpu_bo_reserve(queue->db_obj.obj, true); 548 amdgpu_bo_unpin(queue->db_obj.obj); 549 amdgpu_bo_unreserve(queue->db_obj.obj); 550 amdgpu_bo_unref(&queue->db_obj.obj); 551 552 trace_amdgpu_userq_destroy_end(queue, r); 553 kfree(queue); 554 555 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev); 556 557 return r; 558 } 559 560 static void amdgpu_userq_kref_destroy(struct kref *kref) 561 { 562 int r; 563 struct amdgpu_usermode_queue *queue = 564 container_of(kref, struct amdgpu_usermode_queue, refcount); 565 struct amdgpu_userq_mgr *uq_mgr = queue->userq_mgr; 566 567 r = amdgpu_userq_destroy(uq_mgr, queue); 568 if (r) 569 drm_file_err(uq_mgr->file, "Failed to destroy usermode queue %d\n", r); 570 } 571 572 struct amdgpu_usermode_queue *amdgpu_userq_get(struct amdgpu_userq_mgr *uq_mgr, u32 qid) 573 { 574 struct amdgpu_usermode_queue *queue; 575 576 xa_lock(&uq_mgr->userq_xa); 577 queue = xa_load(&uq_mgr->userq_xa, qid); 578 if (queue) 579 kref_get(&queue->refcount); 580 xa_unlock(&uq_mgr->userq_xa); 581 582 return queue; 583 } 584 585 void amdgpu_userq_put(struct amdgpu_usermode_queue *queue) 586 { 587 if (queue) 588 kref_put(&queue->refcount, amdgpu_userq_kref_destroy); 589 } 590 591 static int amdgpu_userq_priority_permit(struct drm_file *filp, 592 int priority) 593 { 594 if (priority < AMDGPU_USERQ_CREATE_FLAGS_QUEUE_PRIORITY_HIGH) 595 return 0; 596 597 if (capable(CAP_SYS_NICE)) 598 return 0; 599 600 if (drm_is_current_master(filp)) 601 return 0; 602 603 return -EACCES; 604 } 605 606 static int 607 amdgpu_userq_create(struct drm_file *filp, union drm_amdgpu_userq *args) 608 { 609 struct amdgpu_fpriv *fpriv = filp->driver_priv; 610 struct amdgpu_userq_mgr *uq_mgr = &fpriv->userq_mgr; 611 struct amdgpu_device *adev = uq_mgr->adev; 612 const struct amdgpu_userq_funcs *uq_funcs; 613 struct amdgpu_usermode_queue *queue; 614 struct amdgpu_db_info db_info; 615 uint64_t index; 616 int priority; 617 u32 qid; 618 int r; 619 620 priority = 621 (args->in.flags & AMDGPU_USERQ_CREATE_FLAGS_QUEUE_PRIORITY_MASK) 622 >> AMDGPU_USERQ_CREATE_FLAGS_QUEUE_PRIORITY_SHIFT; 623 r = amdgpu_userq_priority_permit(filp, priority); 624 if (r) 625 return r; 626 627 r = pm_runtime_resume_and_get(adev_to_drm(adev)->dev); 628 if (r < 0) { 629 drm_file_err(uq_mgr->file, "pm_runtime_resume_and_get() failed for userqueue create\n"); 630 return r; 631 } 632 633 uq_funcs = adev->userq_funcs[args->in.ip_type]; 634 if (!uq_funcs) { 635 r = -EINVAL; 636 goto err_pm_runtime; 637 } 638 639 queue = kzalloc_obj(struct amdgpu_usermode_queue); 640 if (!queue) { 641 r = -ENOMEM; 642 goto err_pm_runtime; 643 } 644 645 kref_init(&queue->refcount); 646 queue->doorbell_handle = args->in.doorbell_handle; 647 queue->queue_type = args->in.ip_type; 648 queue->vm = &fpriv->vm; 649 queue->priority = priority; 650 queue->xcp_id = (fpriv->xcp_id != AMDGPU_XCP_NO_PARTITION) ? 651 fpriv->xcp_id : 0; 652 queue->userq_mgr = uq_mgr; 653 INIT_DELAYED_WORK(&queue->hang_detect_work, 654 amdgpu_userq_hang_detect_work); 655 656 r = amdgpu_userq_fence_driver_alloc(adev, &queue->fence_drv); 657 if (r) 658 goto free_queue; 659 660 xa_init_flags(&queue->fence_drv_xa, XA_FLAGS_ALLOC); 661 mutex_init(&queue->fence_drv_lock); 662 /* Make sure the queue can actually run with those virtual addresses. */ 663 r = amdgpu_bo_reserve(fpriv->vm.root.bo, false); 664 if (r) 665 goto free_fence_drv; 666 667 if (amdgpu_userq_input_va_validate(adev, queue, args->in.queue_va, 668 args->in.queue_size, 669 &queue->userq_vas.va.queue_rb) || 670 amdgpu_userq_input_va_validate(adev, queue, args->in.rptr_va, 671 AMDGPU_GPU_PAGE_SIZE, 672 &queue->userq_vas.va.rptr) || 673 amdgpu_userq_input_va_validate(adev, queue, args->in.wptr_va, 674 AMDGPU_GPU_PAGE_SIZE, 675 &queue->userq_vas.va.wptr)) { 676 r = -EINVAL; 677 amdgpu_bo_unreserve(fpriv->vm.root.bo); 678 goto free_fence_drv; 679 } 680 amdgpu_bo_unreserve(fpriv->vm.root.bo); 681 682 /* Convert relative doorbell offset into absolute doorbell index */ 683 db_info.queue_type = queue->queue_type; 684 db_info.doorbell_handle = queue->doorbell_handle; 685 db_info.db_obj = &queue->db_obj; 686 db_info.doorbell_offset = args->in.doorbell_offset; 687 r = amdgpu_userq_get_doorbell_index(uq_mgr, &db_info, filp, &index); 688 if (r) { 689 drm_file_err(uq_mgr->file, "Failed to get doorbell for queue\n"); 690 goto free_fence_drv; 691 } 692 693 queue->doorbell_index = index; 694 queue->doorbell_offset = (u32)args->in.doorbell_offset; 695 trace_amdgpu_userq_create_start(queue); 696 r = uq_funcs->mqd_create(queue, &args->in); 697 if (r) { 698 drm_file_err(uq_mgr->file, "Failed to create Queue\n"); 699 goto clean_doorbell_bo; 700 } 701 702 /* Update VM owner at userq submit-time for page-fault attribution. */ 703 amdgpu_vm_set_task_info(&fpriv->vm); 704 705 r = xa_insert_irq(&adev->userq_doorbell_xa, index, queue, 706 GFP_KERNEL); 707 if (r) 708 goto clean_mqd; 709 710 amdgpu_userq_ensure_ev_fence(&fpriv->userq_mgr, &fpriv->evf_mgr); 711 712 /* don't map the queue if scheduling is halted */ 713 if (!adev->userq_halt_for_enforce_isolation || 714 ((queue->queue_type != AMDGPU_HW_IP_GFX) && 715 (queue->queue_type != AMDGPU_HW_IP_COMPUTE))) { 716 r = amdgpu_userq_map_helper(queue); 717 if (r) { 718 drm_file_err(uq_mgr->file, "Failed to map Queue\n"); 719 trace_amdgpu_userq_create_end(queue, r); 720 mutex_unlock(&uq_mgr->userq_mutex); 721 goto erase_doorbell; 722 } 723 } 724 725 atomic_inc(&uq_mgr->userq_count[queue->queue_type]); 726 mutex_unlock(&uq_mgr->userq_mutex); 727 728 r = xa_alloc(&uq_mgr->userq_xa, &qid, queue, 729 XA_LIMIT(1, AMDGPU_MAX_USERQ_COUNT), 730 GFP_KERNEL); 731 if (r) { 732 /* 733 * This drops the last reference which should take care of 734 * all cleanup. 735 */ 736 trace_amdgpu_userq_create_end(queue, r); 737 amdgpu_userq_put(queue); 738 return r; 739 } 740 741 amdgpu_debugfs_userq_init(filp, queue, qid); 742 trace_amdgpu_userq_create_end(queue, 0); 743 args->out.queue_id = qid; 744 return 0; 745 746 erase_doorbell: 747 xa_erase_irq(&adev->userq_doorbell_xa, index); 748 clean_mqd: 749 uq_funcs->mqd_destroy(queue); 750 clean_doorbell_bo: 751 amdgpu_bo_reserve(queue->db_obj.obj, true); 752 amdgpu_bo_unpin(queue->db_obj.obj); 753 amdgpu_bo_unreserve(queue->db_obj.obj); 754 amdgpu_bo_unref(&queue->db_obj.obj); 755 free_fence_drv: 756 amdgpu_userq_fence_driver_free(queue); 757 free_queue: 758 trace_amdgpu_userq_create_end(queue, r); 759 kfree(queue); 760 err_pm_runtime: 761 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev); 762 return r; 763 } 764 765 static int amdgpu_userq_input_args_validate(struct drm_device *dev, 766 union drm_amdgpu_userq *args, 767 struct drm_file *filp) 768 { 769 struct amdgpu_device *adev = drm_to_adev(dev); 770 771 switch (args->in.op) { 772 case AMDGPU_USERQ_OP_CREATE: 773 if (args->in.flags & ~(AMDGPU_USERQ_CREATE_FLAGS_QUEUE_PRIORITY_MASK | 774 AMDGPU_USERQ_CREATE_FLAGS_QUEUE_SECURE)) 775 return -EINVAL; 776 /* Usermode queues are only supported for GFX IP as of now */ 777 if (args->in.ip_type != AMDGPU_HW_IP_GFX && 778 args->in.ip_type != AMDGPU_HW_IP_DMA && 779 args->in.ip_type != AMDGPU_HW_IP_COMPUTE) { 780 drm_file_err(filp, "Usermode queue doesn't support IP type %u\n", 781 args->in.ip_type); 782 return -EINVAL; 783 } 784 785 if ((args->in.flags & AMDGPU_USERQ_CREATE_FLAGS_QUEUE_SECURE) && 786 (args->in.ip_type != AMDGPU_HW_IP_GFX) && 787 (args->in.ip_type != AMDGPU_HW_IP_COMPUTE) && 788 !amdgpu_is_tmz(adev)) { 789 drm_file_err(filp, "Secure only supported on GFX/Compute queues\n"); 790 return -EINVAL; 791 } 792 793 if (args->in.queue_va == AMDGPU_BO_INVALID_OFFSET || 794 args->in.queue_va == 0 || 795 args->in.queue_size == 0) { 796 drm_file_err(filp, "invalidate userq queue va or size\n"); 797 return -EINVAL; 798 } 799 800 if (!is_power_of_2(args->in.queue_size)) { 801 drm_file_err(filp, "Queue size must be a power of 2\n"); 802 return -EINVAL; 803 } 804 805 if (args->in.queue_size < AMDGPU_GPU_PAGE_SIZE) { 806 drm_file_err(filp, "Queue size smaller than AMDGPU_GPU_PAGE_SIZE\n"); 807 return -EINVAL; 808 } 809 810 if (!args->in.wptr_va || !args->in.rptr_va) { 811 drm_file_err(filp, "invalidate userq queue rptr or wptr\n"); 812 return -EINVAL; 813 } 814 break; 815 case AMDGPU_USERQ_OP_FREE: 816 if (args->in.ip_type || 817 args->in.doorbell_handle || 818 args->in.doorbell_offset || 819 args->in.flags || 820 args->in.queue_va || 821 args->in.queue_size || 822 args->in.rptr_va || 823 args->in.wptr_va || 824 args->in.mqd || 825 args->in.mqd_size) 826 return -EINVAL; 827 break; 828 default: 829 return -EINVAL; 830 } 831 832 return 0; 833 } 834 835 bool amdgpu_userq_enabled(struct drm_device *dev) 836 { 837 struct amdgpu_device *adev = drm_to_adev(dev); 838 int i; 839 840 for (i = 0; i < AMDGPU_HW_IP_NUM; i++) { 841 if (adev->userq_funcs[i]) 842 return true; 843 } 844 845 return false; 846 } 847 848 int amdgpu_userq_ioctl(struct drm_device *dev, void *data, 849 struct drm_file *filp) 850 { 851 union drm_amdgpu_userq *args = data; 852 struct amdgpu_fpriv *fpriv = filp->driver_priv; 853 struct amdgpu_usermode_queue *queue; 854 int r = 0; 855 856 if (!amdgpu_userq_enabled(dev)) 857 return -ENOTSUPP; 858 859 if (amdgpu_userq_input_args_validate(dev, args, filp) < 0) 860 return -EINVAL; 861 862 switch (args->in.op) { 863 case AMDGPU_USERQ_OP_CREATE: 864 r = amdgpu_userq_create(filp, args); 865 if (r) 866 drm_file_err(filp, "Failed to create usermode queue\n"); 867 break; 868 869 case AMDGPU_USERQ_OP_FREE: { 870 xa_lock(&fpriv->userq_mgr.userq_xa); 871 queue = __xa_erase(&fpriv->userq_mgr.userq_xa, args->in.queue_id); 872 xa_unlock(&fpriv->userq_mgr.userq_xa); 873 if (!queue) 874 return -ENOENT; 875 876 amdgpu_userq_put(queue); 877 break; 878 } 879 880 default: 881 drm_dbg_driver(dev, "Invalid user queue op specified: %d\n", args->in.op); 882 return -EINVAL; 883 } 884 885 return r; 886 } 887 888 static int 889 amdgpu_userq_restore_all(struct amdgpu_userq_mgr *uq_mgr) 890 { 891 struct amdgpu_usermode_queue *queue; 892 unsigned long queue_id; 893 int ret = 0, r; 894 895 mutex_lock(&uq_mgr->userq_mutex); 896 /* Resume all the queues for this process */ 897 xa_for_each(&uq_mgr->userq_xa, queue_id, queue) { 898 899 if (!amdgpu_userq_buffer_vas_mapped(queue)) { 900 drm_file_err(uq_mgr->file, 901 "trying restore queue without va mapping\n"); 902 trace_amdgpu_userq_state_changed(queue, AMDGPU_USERQ_STATE_INVALID_VA); 903 queue->state = AMDGPU_USERQ_STATE_INVALID_VA; 904 continue; 905 } 906 907 r = amdgpu_userq_map_helper(queue); 908 if (r) 909 ret = r; 910 } 911 mutex_unlock(&uq_mgr->userq_mutex); 912 913 if (ret) 914 drm_file_err(uq_mgr->file, 915 "Failed to map all the queues, restore failed ret=%d\n", ret); 916 return ret; 917 } 918 919 static int amdgpu_userq_validate_vm(void *param, struct amdgpu_bo *bo) 920 { 921 struct ttm_operation_ctx ctx = { false, false }; 922 923 amdgpu_bo_placement_from_domain(bo, bo->allowed_domains); 924 return ttm_bo_validate(&bo->tbo, &bo->placement, &ctx); 925 } 926 927 /* Handle all BOs on the invalidated list, validate them and update the PTs */ 928 static int 929 amdgpu_userq_bo_validate(struct amdgpu_device *adev, struct drm_exec *exec, 930 struct amdgpu_vm *vm) 931 { 932 struct ttm_operation_ctx ctx = { false, false }; 933 struct amdgpu_bo_va *bo_va; 934 struct amdgpu_bo *bo; 935 int ret; 936 937 spin_lock(&vm->individual_lock); 938 while (!list_empty(&vm->always_valid.evicted)) { 939 bo_va = list_first_entry(&vm->always_valid.evicted, 940 struct amdgpu_bo_va, 941 base.vm_status); 942 spin_unlock(&vm->individual_lock); 943 944 bo = bo_va->base.bo; 945 ret = drm_exec_prepare_obj(exec, &bo->tbo.base, 946 TTM_NUM_MOVE_FENCES + 1); 947 if (unlikely(ret)) 948 return ret; 949 950 amdgpu_bo_placement_from_domain(bo, bo->allowed_domains); 951 ret = ttm_bo_validate(&bo->tbo, &bo->placement, &ctx); 952 if (ret) 953 return ret; 954 955 /* This moves the bo_va to the idle list */ 956 ret = amdgpu_vm_bo_update(adev, bo_va, false); 957 if (ret) 958 return ret; 959 960 spin_lock(&vm->individual_lock); 961 } 962 spin_unlock(&vm->individual_lock); 963 964 return 0; 965 } 966 967 /* Make sure the whole VM is ready to be used */ 968 static int 969 amdgpu_userq_vm_validate_and_restore_queue(struct amdgpu_userq_mgr *uq_mgr) 970 { 971 struct amdgpu_fpriv *fpriv = uq_mgr_to_fpriv(uq_mgr); 972 bool invalidated = false, new_addition = false; 973 struct ttm_operation_ctx ctx = { true, false }; 974 struct amdgpu_device *adev = uq_mgr->adev; 975 struct amdgpu_hmm_range *range; 976 struct amdgpu_vm *vm = &fpriv->vm; 977 unsigned long key, tmp_key; 978 struct amdgpu_bo_va *bo_va; 979 struct amdgpu_bo *bo; 980 struct drm_exec exec; 981 struct xarray xa; 982 int ret; 983 984 xa_init(&xa); 985 986 retry_lock: 987 drm_exec_init(&exec, DRM_EXEC_IGNORE_DUPLICATES, 0); 988 drm_exec_until_all_locked(&exec) { 989 ret = amdgpu_vm_lock_pd(vm, &exec, 1); 990 drm_exec_retry_on_contention(&exec); 991 if (unlikely(ret)) 992 goto unlock_all; 993 994 ret = amdgpu_vm_lock_individual(vm, &exec, TTM_NUM_MOVE_FENCES + 1); 995 drm_exec_retry_on_contention(&exec); 996 if (unlikely(ret)) 997 goto unlock_all; 998 999 /* This validates PDs, PTs and per VM BOs */ 1000 ret = amdgpu_vm_validate(adev, vm, NULL, 1001 amdgpu_userq_validate_vm, 1002 NULL); 1003 if (unlikely(ret)) 1004 goto unlock_all; 1005 1006 /* This locks and validates the remaining evicted BOs */ 1007 ret = amdgpu_userq_bo_validate(adev, &exec, vm); 1008 drm_exec_retry_on_contention(&exec); 1009 if (unlikely(ret)) 1010 goto unlock_all; 1011 } 1012 1013 if (invalidated) { 1014 xa_for_each(&xa, tmp_key, range) { 1015 bo = range->bo; 1016 amdgpu_bo_placement_from_domain(bo, AMDGPU_GEM_DOMAIN_CPU); 1017 ret = ttm_bo_validate(&bo->tbo, &bo->placement, &ctx); 1018 if (ret) 1019 goto unlock_all; 1020 1021 amdgpu_ttm_tt_set_user_pages(bo->tbo.ttm, range); 1022 1023 amdgpu_bo_placement_from_domain(bo, AMDGPU_GEM_DOMAIN_GTT); 1024 ret = ttm_bo_validate(&bo->tbo, &bo->placement, &ctx); 1025 if (ret) 1026 goto unlock_all; 1027 } 1028 invalidated = false; 1029 } 1030 1031 ret = amdgpu_vm_handle_moved(adev, vm, NULL); 1032 if (ret) 1033 goto unlock_all; 1034 1035 key = 0; 1036 /* Validate User Ptr BOs */ 1037 list_for_each_entry(bo_va, &vm->always_valid.idle, base.vm_status) { 1038 bo = bo_va->base.bo; 1039 if (!bo) 1040 continue; 1041 1042 if (!amdgpu_ttm_tt_is_userptr(bo->tbo.ttm)) 1043 continue; 1044 1045 range = xa_load(&xa, key); 1046 if (range && range->bo != bo) { 1047 xa_erase(&xa, key); 1048 amdgpu_hmm_range_free(range); 1049 range = NULL; 1050 } 1051 1052 if (!range) { 1053 range = amdgpu_hmm_range_alloc(bo); 1054 if (!range) { 1055 ret = -ENOMEM; 1056 goto unlock_all; 1057 } 1058 1059 xa_store(&xa, key, range, GFP_KERNEL); 1060 new_addition = true; 1061 } 1062 key++; 1063 } 1064 1065 if (new_addition) { 1066 drm_exec_fini(&exec); 1067 xa_for_each(&xa, tmp_key, range) { 1068 if (!range) 1069 continue; 1070 bo = range->bo; 1071 ret = amdgpu_ttm_tt_get_user_pages(bo, range); 1072 if (ret) 1073 goto free_ranges; 1074 } 1075 1076 invalidated = true; 1077 new_addition = false; 1078 goto retry_lock; 1079 } 1080 1081 ret = amdgpu_vm_update_pdes(adev, vm, false); 1082 if (ret) 1083 goto unlock_all; 1084 1085 /* 1086 * We need to wait for all VM updates to finish before restarting the 1087 * queues. Using the idle list like that is now ok since everything is 1088 * locked in place. 1089 */ 1090 list_for_each_entry(bo_va, &vm->always_valid.idle, base.vm_status) 1091 dma_fence_wait(bo_va->last_pt_update, false); 1092 dma_fence_wait(vm->last_update, false); 1093 1094 ret = amdgpu_evf_mgr_rearm(&fpriv->evf_mgr, &exec); 1095 if (ret) { 1096 drm_file_err(uq_mgr->file, "Failed to replace eviction fence\n"); 1097 goto unlock_all; 1098 } 1099 1100 ret = amdgpu_userq_restore_all(uq_mgr); 1101 1102 unlock_all: 1103 drm_exec_fini(&exec); 1104 free_ranges: 1105 xa_for_each(&xa, tmp_key, range) { 1106 if (!range) 1107 continue; 1108 bo = range->bo; 1109 amdgpu_hmm_range_free(range); 1110 } 1111 xa_destroy(&xa); 1112 return ret; 1113 } 1114 1115 static void amdgpu_userq_restore_worker(struct work_struct *work) 1116 { 1117 struct amdgpu_userq_mgr *uq_mgr = work_to_uq_mgr(work, resume_work.work); 1118 struct amdgpu_fpriv *fpriv = uq_mgr_to_fpriv(uq_mgr); 1119 struct dma_fence *ev_fence; 1120 int ret; 1121 1122 ev_fence = amdgpu_evf_mgr_get_fence(&fpriv->evf_mgr); 1123 if (!dma_fence_is_signaled(ev_fence)) 1124 goto put_fence; 1125 1126 ret = amdgpu_userq_vm_validate_and_restore_queue(uq_mgr); 1127 if (ret) { 1128 drm_file_err(uq_mgr->file, "Failed to validate BOs to restore ret=%d\n", ret); 1129 goto put_fence; 1130 } 1131 1132 put_fence: 1133 dma_fence_put(ev_fence); 1134 } 1135 1136 void amdgpu_userq_process_reset_irq(struct amdgpu_device *adev, 1137 u32 pasid, u32 doorbell_offset) 1138 { 1139 struct xarray *xa = &adev->userq_doorbell_xa; 1140 struct amdgpu_usermode_queue *queue; 1141 unsigned long flags, idx; 1142 1143 xa_lock_irqsave(xa, flags); 1144 xa_for_each(xa, idx, queue) { 1145 if (queue->vm && queue->vm->pasid == pasid && 1146 queue->doorbell_offset == doorbell_offset) { 1147 amdgpu_userq_start_hang_detect_work(queue); 1148 break; 1149 } 1150 } 1151 xa_unlock_irqrestore(xa, flags); 1152 } 1153 1154 static int 1155 amdgpu_userq_evict_all(struct amdgpu_userq_mgr *uq_mgr) 1156 { 1157 struct amdgpu_usermode_queue *queue; 1158 unsigned long queue_id; 1159 int ret = 0, r; 1160 1161 /* Try to unmap all the queues in this process ctx */ 1162 xa_for_each(&uq_mgr->userq_xa, queue_id, queue) { 1163 r = amdgpu_userq_unmap_helper(queue); 1164 if (r) 1165 ret = r; 1166 } 1167 1168 if (ret) { 1169 drm_file_err(uq_mgr->file, 1170 "Couldn't unmap all the queues, eviction failed ret=%d\n", ret); 1171 amdgpu_reset_domain_schedule(uq_mgr->adev->reset_domain, 1172 &uq_mgr->reset_work); 1173 flush_work(&uq_mgr->reset_work); 1174 } 1175 return ret; 1176 } 1177 1178 static void 1179 amdgpu_userq_wait_for_signal(struct amdgpu_userq_mgr *uq_mgr) 1180 { 1181 struct amdgpu_usermode_queue *queue; 1182 unsigned long queue_id; 1183 1184 xa_for_each(&uq_mgr->userq_xa, queue_id, queue) { 1185 struct dma_fence *f = queue->last_fence; 1186 1187 if (!f) 1188 continue; 1189 1190 dma_fence_wait(f, false); 1191 } 1192 } 1193 1194 void 1195 amdgpu_userq_evict(struct amdgpu_userq_mgr *uq_mgr) 1196 { 1197 /* Wait for any pending userqueue fence work to finish */ 1198 amdgpu_userq_wait_for_signal(uq_mgr); 1199 amdgpu_userq_evict_all(uq_mgr); 1200 } 1201 1202 int amdgpu_userq_mgr_init(struct amdgpu_userq_mgr *userq_mgr, struct drm_file *file_priv, 1203 struct amdgpu_device *adev) 1204 { 1205 mutex_init(&userq_mgr->userq_mutex); 1206 xa_init_flags(&userq_mgr->userq_xa, XA_FLAGS_ALLOC); 1207 userq_mgr->adev = adev; 1208 userq_mgr->file = file_priv; 1209 mutex_init(&userq_mgr->proc_ctx_lock); 1210 1211 INIT_DELAYED_WORK(&userq_mgr->resume_work, amdgpu_userq_restore_worker); 1212 INIT_WORK(&userq_mgr->reset_work, amdgpu_userq_mgr_reset_work); 1213 return 0; 1214 } 1215 1216 void amdgpu_userq_mgr_cancel_reset_work(struct amdgpu_device *adev) 1217 { 1218 struct xarray *xa = &adev->userq_doorbell_xa; 1219 struct amdgpu_usermode_queue *queue; 1220 unsigned long flags, queue_id; 1221 1222 xa_lock_irqsave(xa, flags); 1223 xa_for_each(xa, queue_id, queue) { 1224 cancel_delayed_work(&queue->hang_detect_work); 1225 cancel_work(&queue->userq_mgr->reset_work); 1226 } 1227 xa_unlock_irqrestore(xa, flags); 1228 } 1229 1230 void amdgpu_userq_mgr_cancel_resume(struct amdgpu_userq_mgr *userq_mgr) 1231 { 1232 cancel_delayed_work_sync(&userq_mgr->resume_work); 1233 } 1234 1235 void amdgpu_userq_mgr_fini(struct amdgpu_userq_mgr *userq_mgr) 1236 { 1237 struct amdgpu_usermode_queue *queue; 1238 unsigned long queue_id = 0; 1239 1240 for (;;) { 1241 xa_lock(&userq_mgr->userq_xa); 1242 queue = xa_find(&userq_mgr->userq_xa, &queue_id, ULONG_MAX, 1243 XA_PRESENT); 1244 if (queue) 1245 __xa_erase(&userq_mgr->userq_xa, queue_id); 1246 xa_unlock(&userq_mgr->userq_xa); 1247 1248 if (!queue) 1249 break; 1250 1251 amdgpu_userq_put(queue); 1252 } 1253 1254 xa_destroy(&userq_mgr->userq_xa); 1255 1256 /* 1257 * Drain any in-flight reset_work. By this point all queues are freed 1258 * and userq_count is 0, so if reset_work starts now it exits early. 1259 * We still need to wait in case it was already executing gpu_recover. 1260 */ 1261 cancel_work_sync(&userq_mgr->reset_work); 1262 1263 amdgpu_bo_free_kernel(&userq_mgr->proc_ctx_obj.obj, 1264 &userq_mgr->proc_ctx_obj.gpu_addr, 1265 &userq_mgr->proc_ctx_obj.cpu_ptr); 1266 1267 mutex_destroy(&userq_mgr->proc_ctx_lock); 1268 mutex_destroy(&userq_mgr->userq_mutex); 1269 } 1270 1271 int amdgpu_userq_suspend(struct amdgpu_device *adev) 1272 { 1273 u32 ip_mask = amdgpu_userq_get_supported_ip_mask(adev); 1274 struct amdgpu_usermode_queue *queue; 1275 struct amdgpu_userq_mgr *uqm; 1276 unsigned long queue_id; 1277 int r; 1278 1279 if (!ip_mask) 1280 return 0; 1281 1282 xa_for_each(&adev->userq_doorbell_xa, queue_id, queue) { 1283 uqm = queue->userq_mgr; 1284 cancel_delayed_work_sync(&uqm->resume_work); 1285 guard(mutex)(&uqm->userq_mutex); 1286 if (adev->in_s0ix) 1287 r = amdgpu_userq_preempt_helper(queue); 1288 else 1289 r = amdgpu_userq_unmap_helper(queue); 1290 if (r) 1291 return r; 1292 } 1293 return 0; 1294 } 1295 1296 int amdgpu_userq_resume(struct amdgpu_device *adev) 1297 { 1298 u32 ip_mask = amdgpu_userq_get_supported_ip_mask(adev); 1299 struct amdgpu_usermode_queue *queue; 1300 struct amdgpu_userq_mgr *uqm; 1301 unsigned long queue_id; 1302 int r; 1303 1304 if (!ip_mask) 1305 return 0; 1306 1307 xa_for_each(&adev->userq_doorbell_xa, queue_id, queue) { 1308 uqm = queue->userq_mgr; 1309 guard(mutex)(&uqm->userq_mutex); 1310 if (adev->in_s0ix) 1311 r = amdgpu_userq_restore_helper(queue); 1312 else 1313 r = amdgpu_userq_map_helper(queue); 1314 if (r) 1315 return r; 1316 } 1317 1318 return 0; 1319 } 1320 1321 int amdgpu_userq_stop_sched_for_enforce_isolation(struct amdgpu_device *adev, 1322 u32 idx) 1323 { 1324 u32 ip_mask = amdgpu_userq_get_supported_ip_mask(adev); 1325 struct amdgpu_usermode_queue *queue; 1326 struct amdgpu_userq_mgr *uqm; 1327 unsigned long queue_id; 1328 int ret = 0, r; 1329 1330 /* only need to stop gfx/compute */ 1331 if (!(ip_mask & ((1 << AMDGPU_HW_IP_GFX) | (1 << AMDGPU_HW_IP_COMPUTE)))) 1332 return 0; 1333 1334 if (adev->userq_halt_for_enforce_isolation) 1335 dev_warn(adev->dev, "userq scheduling already stopped!\n"); 1336 adev->userq_halt_for_enforce_isolation = true; 1337 xa_for_each(&adev->userq_doorbell_xa, queue_id, queue) { 1338 uqm = queue->userq_mgr; 1339 cancel_delayed_work_sync(&uqm->resume_work); 1340 mutex_lock(&uqm->userq_mutex); 1341 if (((queue->queue_type == AMDGPU_HW_IP_GFX) || 1342 (queue->queue_type == AMDGPU_HW_IP_COMPUTE)) && 1343 (queue->xcp_id == idx)) { 1344 r = amdgpu_userq_preempt_helper(queue); 1345 if (r) 1346 ret = r; 1347 } 1348 mutex_unlock(&uqm->userq_mutex); 1349 } 1350 1351 return ret; 1352 } 1353 1354 int amdgpu_userq_start_sched_for_enforce_isolation(struct amdgpu_device *adev, 1355 u32 idx) 1356 { 1357 u32 ip_mask = amdgpu_userq_get_supported_ip_mask(adev); 1358 struct amdgpu_usermode_queue *queue; 1359 struct amdgpu_userq_mgr *uqm; 1360 unsigned long queue_id; 1361 int ret = 0, r; 1362 1363 /* only need to stop gfx/compute */ 1364 if (!(ip_mask & ((1 << AMDGPU_HW_IP_GFX) | (1 << AMDGPU_HW_IP_COMPUTE)))) 1365 return 0; 1366 1367 if (!adev->userq_halt_for_enforce_isolation) 1368 dev_warn(adev->dev, "userq scheduling already started!\n"); 1369 1370 adev->userq_halt_for_enforce_isolation = false; 1371 1372 xa_for_each(&adev->userq_doorbell_xa, queue_id, queue) { 1373 uqm = queue->userq_mgr; 1374 mutex_lock(&uqm->userq_mutex); 1375 if (((queue->queue_type == AMDGPU_HW_IP_GFX) || 1376 (queue->queue_type == AMDGPU_HW_IP_COMPUTE)) && 1377 (queue->xcp_id == idx)) { 1378 r = amdgpu_userq_restore_helper(queue); 1379 if (r) 1380 ret = r; 1381 } 1382 mutex_unlock(&uqm->userq_mutex); 1383 } 1384 1385 return ret; 1386 } 1387 1388 void amdgpu_userq_gem_va_unmap_validate(struct amdgpu_device *adev, 1389 struct amdgpu_bo_va_mapping *mapping) 1390 { 1391 u32 ip_mask = amdgpu_userq_get_supported_ip_mask(adev); 1392 struct amdgpu_bo_va *bo_va = mapping->bo_va; 1393 struct dma_resv *resv = bo_va->base.bo->tbo.base.resv; 1394 1395 if (!ip_mask) 1396 return; 1397 1398 /** 1399 * The userq VA mapping reservation should include the eviction fence. 1400 * Note: The eviction fence may be attached to different BOs and this 1401 * unmap is only for one kind of userq VAs, so at this point suppose 1402 * the eviction fence is always unsignaled. 1403 */ 1404 dma_resv_wait_timeout(resv, DMA_RESV_USAGE_BOOKKEEP, 1405 false, MAX_SCHEDULE_TIMEOUT); 1406 } 1407 1408 void amdgpu_userq_pre_reset(struct amdgpu_device *adev) 1409 { 1410 const struct amdgpu_userq_funcs *userq_funcs; 1411 struct amdgpu_usermode_queue *queue; 1412 unsigned long queue_id; 1413 1414 /* TODO: We probably need a new lock for the queue state */ 1415 xa_for_each(&adev->userq_doorbell_xa, queue_id, queue) { 1416 if (queue->state != AMDGPU_USERQ_STATE_MAPPED) 1417 continue; 1418 1419 trace_amdgpu_userq_state_start(queue); 1420 userq_funcs = adev->userq_funcs[queue->queue_type]; 1421 userq_funcs->unmap(queue); 1422 /* just mark all queues as hung at this point. 1423 * if unmap succeeds, we could map again 1424 * in amdgpu_userq_post_reset() if vram is not lost 1425 */ 1426 trace_amdgpu_userq_state_changed(queue, AMDGPU_USERQ_STATE_HUNG); 1427 queue->state = AMDGPU_USERQ_STATE_HUNG; 1428 amdgpu_userq_fence_driver_force_completion(queue); 1429 } 1430 } 1431 1432 int amdgpu_userq_post_reset(struct amdgpu_device *adev, bool vram_lost) 1433 { 1434 /* if any queue state is AMDGPU_USERQ_STATE_UNMAPPED 1435 * at this point, we should be able to map it again 1436 * and continue if vram is not lost. 1437 */ 1438 struct amdgpu_usermode_queue *queue; 1439 const struct amdgpu_userq_funcs *userq_funcs; 1440 unsigned long queue_id; 1441 int r = 0; 1442 1443 xa_for_each(&adev->userq_doorbell_xa, queue_id, queue) { 1444 if (queue->state == AMDGPU_USERQ_STATE_HUNG && !vram_lost) { 1445 trace_amdgpu_userq_state_start(queue); 1446 1447 userq_funcs = adev->userq_funcs[queue->queue_type]; 1448 /* Re-map queue */ 1449 r = userq_funcs->map(queue); 1450 if (r) { 1451 dev_err(adev->dev, "Failed to remap queue %ld\n", queue_id); 1452 continue; 1453 } 1454 trace_amdgpu_userq_state_changed(queue, AMDGPU_USERQ_STATE_MAPPED); 1455 queue->state = AMDGPU_USERQ_STATE_MAPPED; 1456 } 1457 } 1458 1459 return r; 1460 } 1461