1 /* $NetBSD: amdgpu_fence.c,v 1.6 2020/02/14 14:34:58 maya Exp $ */ 2 3 /* 4 * Copyright 2009 Jerome Glisse. 5 * All Rights Reserved. 6 * 7 * Permission is hereby granted, free of charge, to any person obtaining a 8 * copy of this software and associated documentation files (the 9 * "Software"), to deal in the Software without restriction, including 10 * without limitation the rights to use, copy, modify, merge, publish, 11 * distribute, sub license, and/or sell copies of the Software, and to 12 * permit persons to whom the Software is furnished to do so, subject to 13 * the following conditions: 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 NON-INFRINGEMENT. IN NO EVENT SHALL 18 * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, 19 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 20 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE 21 * USE OR OTHER DEALINGS IN THE SOFTWARE. 22 * 23 * The above copyright notice and this permission notice (including the 24 * next paragraph) shall be included in all copies or substantial portions 25 * of the Software. 26 * 27 */ 28 /* 29 * Authors: 30 * Jerome Glisse <glisse@freedesktop.org> 31 * Dave Airlie 32 */ 33 #include <sys/cdefs.h> 34 __KERNEL_RCSID(0, "$NetBSD: amdgpu_fence.c,v 1.6 2020/02/14 14:34:58 maya Exp $"); 35 36 #include <linux/seq_file.h> 37 #include <linux/atomic.h> 38 #include <linux/wait.h> 39 #include <linux/kref.h> 40 #include <linux/slab.h> 41 #include <linux/firmware.h> 42 #include <drm/drmP.h> 43 #include "amdgpu.h" 44 #include "amdgpu_trace.h" 45 46 #include <linux/nbsd-namespace.h> 47 48 /* 49 * Fences 50 * Fences mark an event in the GPUs pipeline and are used 51 * for GPU/CPU synchronization. When the fence is written, 52 * it is expected that all buffers associated with that fence 53 * are no longer in use by the associated ring on the GPU and 54 * that the the relevant GPU caches have been flushed. 55 */ 56 57 static struct kmem_cache *amdgpu_fence_slab; 58 static atomic_t amdgpu_fence_slab_ref = ATOMIC_INIT(0); 59 60 /** 61 * amdgpu_fence_write - write a fence value 62 * 63 * @ring: ring the fence is associated with 64 * @seq: sequence number to write 65 * 66 * Writes a fence value to memory (all asics). 67 */ 68 static void amdgpu_fence_write(struct amdgpu_ring *ring, u32 seq) 69 { 70 struct amdgpu_fence_driver *drv = &ring->fence_drv; 71 72 if (drv->cpu_addr) 73 *drv->cpu_addr = cpu_to_le32(seq); 74 } 75 76 /** 77 * amdgpu_fence_read - read a fence value 78 * 79 * @ring: ring the fence is associated with 80 * 81 * Reads a fence value from memory (all asics). 82 * Returns the value of the fence read from memory. 83 */ 84 static u32 amdgpu_fence_read(struct amdgpu_ring *ring) 85 { 86 struct amdgpu_fence_driver *drv = &ring->fence_drv; 87 u32 seq = 0; 88 89 if (drv->cpu_addr) 90 seq = le32_to_cpu(*drv->cpu_addr); 91 else 92 seq = lower_32_bits(atomic64_read(&drv->last_seq)); 93 94 return seq; 95 } 96 97 /** 98 * amdgpu_fence_emit - emit a fence on the requested ring 99 * 100 * @ring: ring the fence is associated with 101 * @owner: creator of the fence 102 * @fence: amdgpu fence object 103 * 104 * Emits a fence command on the requested ring (all asics). 105 * Returns 0 on success, -ENOMEM on failure. 106 */ 107 int amdgpu_fence_emit(struct amdgpu_ring *ring, void *owner, 108 struct amdgpu_fence **fence) 109 { 110 struct amdgpu_device *adev = ring->adev; 111 112 /* we are protected by the ring emission mutex */ 113 *fence = kmem_cache_alloc(amdgpu_fence_slab, GFP_KERNEL); 114 if ((*fence) == NULL) { 115 return -ENOMEM; 116 } 117 (*fence)->seq = ++ring->fence_drv.sync_seq[ring->idx]; 118 (*fence)->ring = ring; 119 (*fence)->owner = owner; 120 fence_init(&(*fence)->base, &amdgpu_fence_ops, 121 #ifdef __NetBSD__ 122 &ring->fence_drv.fence_lock, 123 #else 124 &ring->fence_drv.fence_queue.lock, 125 #endif 126 adev->fence_context + ring->idx, 127 (*fence)->seq); 128 amdgpu_ring_emit_fence(ring, ring->fence_drv.gpu_addr, 129 (*fence)->seq, 130 AMDGPU_FENCE_FLAG_INT); 131 return 0; 132 } 133 134 /** 135 * amdgpu_fence_schedule_fallback - schedule fallback check 136 * 137 * @ring: pointer to struct amdgpu_ring 138 * 139 * Start a timer as fallback to our interrupts. 140 */ 141 static void amdgpu_fence_schedule_fallback(struct amdgpu_ring *ring) 142 { 143 mod_timer(&ring->fence_drv.fallback_timer, 144 jiffies + AMDGPU_FENCE_JIFFIES_TIMEOUT); 145 } 146 147 /** 148 * amdgpu_fence_activity - check for fence activity 149 * 150 * @ring: pointer to struct amdgpu_ring 151 * 152 * Checks the current fence value and calculates the last 153 * signalled fence value. Returns true if activity occured 154 * on the ring, and the fence_queue should be waken up. 155 */ 156 static bool amdgpu_fence_activity(struct amdgpu_ring *ring) 157 { 158 uint64_t seq, last_seq, last_emitted; 159 unsigned count_loop = 0; 160 bool wake = false; 161 162 BUG_ON(!spin_is_locked(&ring->fence_drv.fence_lock)); 163 164 /* Note there is a scenario here for an infinite loop but it's 165 * very unlikely to happen. For it to happen, the current polling 166 * process need to be interrupted by another process and another 167 * process needs to update the last_seq btw the atomic read and 168 * xchg of the current process. 169 * 170 * More over for this to go in infinite loop there need to be 171 * continuously new fence signaled ie amdgpu_fence_read needs 172 * to return a different value each time for both the currently 173 * polling process and the other process that xchg the last_seq 174 * btw atomic read and xchg of the current process. And the 175 * value the other process set as last seq must be higher than 176 * the seq value we just read. Which means that current process 177 * need to be interrupted after amdgpu_fence_read and before 178 * atomic xchg. 179 * 180 * To be even more safe we count the number of time we loop and 181 * we bail after 10 loop just accepting the fact that we might 182 * have temporarly set the last_seq not to the true real last 183 * seq but to an older one. 184 */ 185 last_seq = atomic64_read(&ring->fence_drv.last_seq); 186 do { 187 last_emitted = ring->fence_drv.sync_seq[ring->idx]; 188 seq = amdgpu_fence_read(ring); 189 seq |= last_seq & 0xffffffff00000000LL; 190 if (seq < last_seq) { 191 seq &= 0xffffffff; 192 seq |= last_emitted & 0xffffffff00000000LL; 193 } 194 195 if (seq <= last_seq || seq > last_emitted) { 196 break; 197 } 198 /* If we loop over we don't want to return without 199 * checking if a fence is signaled as it means that the 200 * seq we just read is different from the previous on. 201 */ 202 wake = true; 203 last_seq = seq; 204 if ((count_loop++) > 10) { 205 /* We looped over too many time leave with the 206 * fact that we might have set an older fence 207 * seq then the current real last seq as signaled 208 * by the hw. 209 */ 210 break; 211 } 212 } while (atomic64_xchg(&ring->fence_drv.last_seq, seq) > seq); 213 214 if (seq < last_emitted) 215 amdgpu_fence_schedule_fallback(ring); 216 217 return wake; 218 } 219 220 #ifdef __NetBSD__ 221 static int amdgpu_fence_check_signaled(struct amdgpu_fence *); 222 223 static void 224 amdgpu_fence_wakeup_locked(struct amdgpu_ring *ring) 225 { 226 struct amdgpu_fence *fence, *next; 227 228 BUG_ON(!spin_is_locked(&ring->fence_drv.fence_lock)); 229 DRM_SPIN_WAKEUP_ALL(&ring->fence_drv.fence_queue, 230 &ring->fence_drv.fence_lock); 231 TAILQ_FOREACH_SAFE(fence, &ring->fence_drv.fence_check, fence_check, 232 next) { 233 amdgpu_fence_check_signaled(fence); 234 } 235 } 236 #endif 237 238 /** 239 * amdgpu_fence_process - process a fence 240 * 241 * @adev: amdgpu_device pointer 242 * @ring: ring index the fence is associated with 243 * 244 * Checks the current fence value and wakes the fence queue 245 * if the sequence number has increased (all asics). 246 */ 247 static void amdgpu_fence_process_locked(struct amdgpu_ring *ring) 248 { 249 if (amdgpu_fence_activity(ring)) 250 #ifdef __NetBSD__ 251 amdgpu_fence_wakeup_locked(ring); 252 #else 253 wake_up_all(&ring->fence_drv.fence_queue); 254 #endif 255 } 256 257 void amdgpu_fence_process(struct amdgpu_ring *ring) 258 { 259 260 spin_lock(&ring->fence_drv.fence_lock); 261 amdgpu_fence_process_locked(ring); 262 spin_unlock(&ring->fence_drv.fence_lock); 263 } 264 265 /** 266 * amdgpu_fence_fallback - fallback for hardware interrupts 267 * 268 * @work: delayed work item 269 * 270 * Checks for fence activity. 271 */ 272 static void amdgpu_fence_fallback(unsigned long arg) 273 { 274 struct amdgpu_ring *ring = (void *)arg; 275 276 amdgpu_fence_process(ring); 277 } 278 279 /** 280 * amdgpu_fence_seq_signaled - check if a fence sequence number has signaled 281 * 282 * @ring: ring the fence is associated with 283 * @seq: sequence number 284 * 285 * Check if the last signaled fence sequnce number is >= the requested 286 * sequence number (all asics). 287 * Returns true if the fence has signaled (current fence value 288 * is >= requested value) or false if it has not (current fence 289 * value is < the requested value. Helper function for 290 * amdgpu_fence_signaled(). 291 */ 292 static bool amdgpu_fence_seq_signaled(struct amdgpu_ring *ring, u64 seq) 293 { 294 if (atomic64_read(&ring->fence_drv.last_seq) >= seq) 295 return true; 296 297 /* poll new last sequence at least once */ 298 amdgpu_fence_process(ring); 299 if (atomic64_read(&ring->fence_drv.last_seq) >= seq) 300 return true; 301 302 return false; 303 } 304 305 /* 306 * amdgpu_ring_wait_seq_timeout - wait for seq of the specific ring to signal 307 * @ring: ring to wait on for the seq number 308 * @seq: seq number wait for 309 * 310 * return value: 311 * 0: seq signaled, and gpu not hang 312 * -EDEADL: GPU hang detected 313 * -EINVAL: some paramter is not valid 314 */ 315 static int amdgpu_fence_ring_wait_seq(struct amdgpu_ring *ring, uint64_t seq) 316 { 317 bool signaled = false; 318 319 BUG_ON(!ring); 320 BUG_ON(!spin_is_locked(&ring->fence_drv.fence_lock)); 321 if (seq > ring->fence_drv.sync_seq[ring->idx]) 322 return -EINVAL; 323 324 if (atomic64_read(&ring->fence_drv.last_seq) >= seq) 325 return 0; 326 327 amdgpu_fence_schedule_fallback(ring); 328 #ifdef __NetBSD__ 329 /* XXX How is this ever supposed to wake up in the EDEADLK case? */ 330 int r __unused; 331 DRM_SPIN_WAIT_NOINTR_UNTIL(r, &ring->fence_drv.fence_queue, 332 &ring->fence_drv.fence_lock, 333 (signaled = amdgpu_fence_seq_signaled(ring, seq))); 334 #else 335 wait_event(ring->fence_drv.fence_queue, ( 336 (signaled = amdgpu_fence_seq_signaled(ring, seq)))); 337 #endif 338 339 if (signaled) 340 return 0; 341 else 342 return -EDEADLK; 343 } 344 345 /** 346 * amdgpu_fence_wait_next - wait for the next fence to signal 347 * 348 * @adev: amdgpu device pointer 349 * @ring: ring index the fence is associated with 350 * 351 * Wait for the next fence on the requested ring to signal (all asics). 352 * Returns 0 if the next fence has passed, error for all other cases. 353 * Caller must hold ring lock. 354 */ 355 int amdgpu_fence_wait_next(struct amdgpu_ring *ring) 356 { 357 uint64_t seq = atomic64_read(&ring->fence_drv.last_seq) + 1ULL; 358 359 if (seq >= ring->fence_drv.sync_seq[ring->idx]) 360 return -ENOENT; 361 362 return amdgpu_fence_ring_wait_seq(ring, seq); 363 } 364 365 /** 366 * amdgpu_fence_wait_empty - wait for all fences to signal 367 * 368 * @adev: amdgpu device pointer 369 * @ring: ring index the fence is associated with 370 * 371 * Wait for all fences on the requested ring to signal (all asics). 372 * Returns 0 if the fences have passed, error for all other cases. 373 * Caller must hold ring lock. 374 */ 375 int amdgpu_fence_wait_empty(struct amdgpu_ring *ring) 376 { 377 uint64_t seq = ring->fence_drv.sync_seq[ring->idx]; 378 379 if (!seq) 380 return 0; 381 382 return amdgpu_fence_ring_wait_seq(ring, seq); 383 } 384 385 /** 386 * amdgpu_fence_count_emitted - get the count of emitted fences 387 * 388 * @ring: ring the fence is associated with 389 * 390 * Get the number of fences emitted on the requested ring (all asics). 391 * Returns the number of emitted fences on the ring. Used by the 392 * dynpm code to ring track activity. 393 */ 394 unsigned amdgpu_fence_count_emitted(struct amdgpu_ring *ring) 395 { 396 uint64_t emitted; 397 398 /* We are not protected by ring lock when reading the last sequence 399 * but it's ok to report slightly wrong fence count here. 400 */ 401 amdgpu_fence_process(ring); 402 emitted = ring->fence_drv.sync_seq[ring->idx] 403 - atomic64_read(&ring->fence_drv.last_seq); 404 /* to avoid 32bits warp around */ 405 if (emitted > 0x10000000) 406 emitted = 0x10000000; 407 408 return (unsigned)emitted; 409 } 410 411 /** 412 * amdgpu_fence_need_sync - do we need a semaphore 413 * 414 * @fence: amdgpu fence object 415 * @dst_ring: which ring to check against 416 * 417 * Check if the fence needs to be synced against another ring 418 * (all asics). If so, we need to emit a semaphore. 419 * Returns true if we need to sync with another ring, false if 420 * not. 421 */ 422 bool amdgpu_fence_need_sync(struct amdgpu_fence *fence, 423 struct amdgpu_ring *dst_ring) 424 { 425 struct amdgpu_fence_driver *fdrv; 426 427 if (!fence) 428 return false; 429 430 if (fence->ring == dst_ring) 431 return false; 432 433 /* we are protected by the ring mutex */ 434 fdrv = &dst_ring->fence_drv; 435 if (fence->seq <= fdrv->sync_seq[fence->ring->idx]) 436 return false; 437 438 return true; 439 } 440 441 /** 442 * amdgpu_fence_note_sync - record the sync point 443 * 444 * @fence: amdgpu fence object 445 * @dst_ring: which ring to check against 446 * 447 * Note the sequence number at which point the fence will 448 * be synced with the requested ring (all asics). 449 */ 450 void amdgpu_fence_note_sync(struct amdgpu_fence *fence, 451 struct amdgpu_ring *dst_ring) 452 { 453 struct amdgpu_fence_driver *dst, *src; 454 unsigned i; 455 456 if (!fence) 457 return; 458 459 if (fence->ring == dst_ring) 460 return; 461 462 /* we are protected by the ring mutex */ 463 src = &fence->ring->fence_drv; 464 dst = &dst_ring->fence_drv; 465 for (i = 0; i < AMDGPU_MAX_RINGS; ++i) { 466 if (i == dst_ring->idx) 467 continue; 468 469 dst->sync_seq[i] = max(dst->sync_seq[i], src->sync_seq[i]); 470 } 471 } 472 473 /** 474 * amdgpu_fence_driver_start_ring - make the fence driver 475 * ready for use on the requested ring. 476 * 477 * @ring: ring to start the fence driver on 478 * @irq_src: interrupt source to use for this ring 479 * @irq_type: interrupt type to use for this ring 480 * 481 * Make the fence driver ready for processing (all asics). 482 * Not all asics have all rings, so each asic will only 483 * start the fence driver on the rings it has. 484 * Returns 0 for success, errors for failure. 485 */ 486 int amdgpu_fence_driver_start_ring(struct amdgpu_ring *ring, 487 struct amdgpu_irq_src *irq_src, 488 unsigned irq_type) 489 { 490 struct amdgpu_device *adev = ring->adev; 491 uint64_t index; 492 493 if (ring != &adev->uvd.ring) { 494 ring->fence_drv.cpu_addr = &adev->wb.wb[ring->fence_offs]; 495 ring->fence_drv.gpu_addr = adev->wb.gpu_addr + (ring->fence_offs * 4); 496 } else { 497 /* put fence directly behind firmware */ 498 index = ALIGN(adev->uvd.fw->size, 8); 499 ring->fence_drv.cpu_addr = adev->uvd.cpu_addr + index; 500 ring->fence_drv.gpu_addr = adev->uvd.gpu_addr + index; 501 } 502 amdgpu_fence_write(ring, atomic64_read(&ring->fence_drv.last_seq)); 503 amdgpu_irq_get(adev, irq_src, irq_type); 504 505 ring->fence_drv.irq_src = irq_src; 506 ring->fence_drv.irq_type = irq_type; 507 ring->fence_drv.initialized = true; 508 509 dev_info(adev->dev, "fence driver on ring %d use gpu addr 0x%016"PRIx64", " 510 "cpu addr 0x%p\n", ring->idx, 511 ring->fence_drv.gpu_addr, ring->fence_drv.cpu_addr); 512 return 0; 513 } 514 515 /** 516 * amdgpu_fence_driver_init_ring - init the fence driver 517 * for the requested ring. 518 * 519 * @ring: ring to init the fence driver on 520 * 521 * Init the fence driver for the requested ring (all asics). 522 * Helper function for amdgpu_fence_driver_init(). 523 */ 524 int amdgpu_fence_driver_init_ring(struct amdgpu_ring *ring) 525 { 526 int i, r; 527 528 ring->fence_drv.cpu_addr = NULL; 529 ring->fence_drv.gpu_addr = 0; 530 for (i = 0; i < AMDGPU_MAX_RINGS; ++i) 531 ring->fence_drv.sync_seq[i] = 0; 532 533 atomic64_set(&ring->fence_drv.last_seq, 0); 534 ring->fence_drv.initialized = false; 535 536 setup_timer(&ring->fence_drv.fallback_timer, amdgpu_fence_fallback, 537 (unsigned long)ring); 538 539 #ifdef __NetBSD__ 540 spin_lock_init(&ring->fence_drv.fence_lock); 541 DRM_INIT_WAITQUEUE(&ring->fence_drv.fence_queue, "amdfence"); 542 TAILQ_INIT(&ring->fence_drv.fence_check); 543 #else 544 init_waitqueue_head(&ring->fence_drv.fence_queue); 545 #endif 546 547 if (amdgpu_enable_scheduler) { 548 long timeout = msecs_to_jiffies(amdgpu_lockup_timeout); 549 if (timeout == 0) { 550 /* 551 * FIXME: 552 * Delayed workqueue cannot use it directly, 553 * so the scheduler will not use delayed workqueue if 554 * MAX_SCHEDULE_TIMEOUT is set. 555 * Currently keep it simple and silly. 556 */ 557 timeout = MAX_SCHEDULE_TIMEOUT; 558 } 559 r = amd_sched_init(&ring->sched, &amdgpu_sched_ops, 560 amdgpu_sched_hw_submission, 561 timeout, ring->name); 562 if (r) { 563 DRM_ERROR("Failed to create scheduler on ring %s.\n", 564 ring->name); 565 return r; 566 } 567 } 568 569 return 0; 570 } 571 572 /** 573 * amdgpu_fence_driver_init - init the fence driver 574 * for all possible rings. 575 * 576 * @adev: amdgpu device pointer 577 * 578 * Init the fence driver for all possible rings (all asics). 579 * Not all asics have all rings, so each asic will only 580 * start the fence driver on the rings it has using 581 * amdgpu_fence_driver_start_ring(). 582 * Returns 0 for success. 583 */ 584 int amdgpu_fence_driver_init(struct amdgpu_device *adev) 585 { 586 if (atomic_inc_return(&amdgpu_fence_slab_ref) == 1) { 587 amdgpu_fence_slab = kmem_cache_create( 588 "amdgpu_fence", sizeof(struct amdgpu_fence), 0, 589 SLAB_HWCACHE_ALIGN, NULL); 590 if (!amdgpu_fence_slab) 591 return -ENOMEM; 592 } 593 if (amdgpu_debugfs_fence_init(adev)) 594 dev_err(adev->dev, "fence debugfs file creation failed\n"); 595 596 return 0; 597 } 598 599 /** 600 * amdgpu_fence_driver_fini - tear down the fence driver 601 * for all possible rings. 602 * 603 * @adev: amdgpu device pointer 604 * 605 * Tear down the fence driver for all possible rings (all asics). 606 */ 607 void amdgpu_fence_driver_fini(struct amdgpu_device *adev) 608 { 609 int i, r; 610 611 if (atomic_dec_and_test(&amdgpu_fence_slab_ref)) 612 kmem_cache_destroy(amdgpu_fence_slab); 613 mutex_lock(&adev->ring_lock); 614 for (i = 0; i < AMDGPU_MAX_RINGS; i++) { 615 struct amdgpu_ring *ring = adev->rings[i]; 616 617 if (!ring || !ring->fence_drv.initialized) 618 continue; 619 r = amdgpu_fence_wait_empty(ring); 620 if (r) { 621 /* no need to trigger GPU reset as we are unloading */ 622 amdgpu_fence_driver_force_completion(adev); 623 } 624 #ifdef __NetBSD__ 625 spin_lock(&ring->fence_drv.fence_lock); 626 amdgpu_fence_wakeup_locked(ring); 627 spin_unlock(&ring->fence_drv.fence_lock); 628 #else 629 wake_up_all(&ring->fence_drv.fence_queue); 630 #endif 631 amdgpu_irq_put(adev, ring->fence_drv.irq_src, 632 ring->fence_drv.irq_type); 633 amd_sched_fini(&ring->sched); 634 del_timer_sync(&ring->fence_drv.fallback_timer); 635 ring->fence_drv.initialized = false; 636 #ifdef __NetBSD__ 637 BUG_ON(!TAILQ_EMPTY(&ring->fence_drv.fence_check)); 638 DRM_DESTROY_WAITQUEUE(&ring->fence_drv.fence_queue); 639 spin_lock_destroy(&ring->fence_drv.fence_lock); 640 #endif 641 } 642 mutex_unlock(&adev->ring_lock); 643 } 644 645 /** 646 * amdgpu_fence_driver_suspend - suspend the fence driver 647 * for all possible rings. 648 * 649 * @adev: amdgpu device pointer 650 * 651 * Suspend the fence driver for all possible rings (all asics). 652 */ 653 void amdgpu_fence_driver_suspend(struct amdgpu_device *adev) 654 { 655 int i, r; 656 657 mutex_lock(&adev->ring_lock); 658 for (i = 0; i < AMDGPU_MAX_RINGS; i++) { 659 struct amdgpu_ring *ring = adev->rings[i]; 660 if (!ring || !ring->fence_drv.initialized) 661 continue; 662 663 /* wait for gpu to finish processing current batch */ 664 r = amdgpu_fence_wait_empty(ring); 665 if (r) { 666 /* delay GPU reset to resume */ 667 amdgpu_fence_driver_force_completion(adev); 668 } 669 670 /* disable the interrupt */ 671 amdgpu_irq_put(adev, ring->fence_drv.irq_src, 672 ring->fence_drv.irq_type); 673 } 674 mutex_unlock(&adev->ring_lock); 675 } 676 677 /** 678 * amdgpu_fence_driver_resume - resume the fence driver 679 * for all possible rings. 680 * 681 * @adev: amdgpu device pointer 682 * 683 * Resume the fence driver for all possible rings (all asics). 684 * Not all asics have all rings, so each asic will only 685 * start the fence driver on the rings it has using 686 * amdgpu_fence_driver_start_ring(). 687 * Returns 0 for success. 688 */ 689 void amdgpu_fence_driver_resume(struct amdgpu_device *adev) 690 { 691 int i; 692 693 mutex_lock(&adev->ring_lock); 694 for (i = 0; i < AMDGPU_MAX_RINGS; i++) { 695 struct amdgpu_ring *ring = adev->rings[i]; 696 if (!ring || !ring->fence_drv.initialized) 697 continue; 698 699 /* enable the interrupt */ 700 amdgpu_irq_get(adev, ring->fence_drv.irq_src, 701 ring->fence_drv.irq_type); 702 } 703 mutex_unlock(&adev->ring_lock); 704 } 705 706 /** 707 * amdgpu_fence_driver_force_completion - force all fence waiter to complete 708 * 709 * @adev: amdgpu device pointer 710 * 711 * In case of GPU reset failure make sure no process keep waiting on fence 712 * that will never complete. 713 */ 714 void amdgpu_fence_driver_force_completion(struct amdgpu_device *adev) 715 { 716 int i; 717 718 for (i = 0; i < AMDGPU_MAX_RINGS; i++) { 719 struct amdgpu_ring *ring = adev->rings[i]; 720 if (!ring || !ring->fence_drv.initialized) 721 continue; 722 723 amdgpu_fence_write(ring, ring->fence_drv.sync_seq[i]); 724 } 725 } 726 727 /* 728 * Common fence implementation 729 */ 730 731 static const char *amdgpu_fence_get_driver_name(struct fence *fence) 732 { 733 return "amdgpu"; 734 } 735 736 static const char *amdgpu_fence_get_timeline_name(struct fence *f) 737 { 738 struct amdgpu_fence *fence = to_amdgpu_fence(f); 739 return (const char *)fence->ring->name; 740 } 741 742 /** 743 * amdgpu_fence_is_signaled - test if fence is signaled 744 * 745 * @f: fence to test 746 * 747 * Test the fence sequence number if it is already signaled. If it isn't 748 * signaled start fence processing. Returns True if the fence is signaled. 749 */ 750 static bool amdgpu_fence_is_signaled(struct fence *f) 751 { 752 struct amdgpu_fence *fence = to_amdgpu_fence(f); 753 struct amdgpu_ring *ring = fence->ring; 754 755 if (atomic64_read(&ring->fence_drv.last_seq) >= fence->seq) 756 return true; 757 758 amdgpu_fence_process(ring); 759 760 if (atomic64_read(&ring->fence_drv.last_seq) >= fence->seq) 761 return true; 762 763 return false; 764 } 765 766 /** 767 * amdgpu_fence_check_signaled - callback from fence_queue 768 * 769 * this function is called with fence_queue lock held, which is also used 770 * for the fence locking itself, so unlocked variants are used for 771 * fence_signal, and remove_wait_queue. 772 */ 773 #ifdef __NetBSD__ 774 static int amdgpu_fence_check_signaled(struct amdgpu_fence *fence) 775 #else 776 static int amdgpu_fence_check_signaled(wait_queue_t *wait, unsigned mode, int flags, void *key) 777 #endif 778 { 779 #ifndef __NetBSD__ 780 struct amdgpu_fence *fence; 781 #endif 782 u64 seq; 783 int ret; 784 785 #ifndef __NetBSD__ 786 fence = container_of(wait, struct amdgpu_fence, fence_wake); 787 #endif 788 BUG_ON(!spin_is_locked(&fence->ring->fence_drv.fence_lock)); 789 790 /* 791 * We cannot use amdgpu_fence_process here because we're already 792 * in the waitqueue, in a call from wake_up_all. 793 */ 794 seq = atomic64_read(&fence->ring->fence_drv.last_seq); 795 if (seq >= fence->seq) { 796 ret = fence_signal_locked(&fence->base); 797 if (!ret) 798 FENCE_TRACE(&fence->base, "signaled from irq context\n"); 799 else 800 FENCE_TRACE(&fence->base, "was already signaled\n"); 801 802 #ifdef __NetBSD__ 803 TAILQ_REMOVE(&fence->ring->fence_drv.fence_check, fence, 804 fence_check); 805 #else 806 __remove_wait_queue(&fence->ring->fence_drv.fence_queue, &fence->fence_wake); 807 #endif 808 fence_put(&fence->base); 809 } else 810 FENCE_TRACE(&fence->base, "pending\n"); 811 return 0; 812 } 813 814 /** 815 * amdgpu_fence_enable_signaling - enable signalling on fence 816 * @fence: fence 817 * 818 * This function is called with fence_queue lock held, and adds a callback 819 * to fence_queue that checks if this fence is signaled, and if so it 820 * signals the fence and removes itself. 821 */ 822 static bool amdgpu_fence_enable_signaling(struct fence *f) 823 { 824 struct amdgpu_fence *fence = to_amdgpu_fence(f); 825 struct amdgpu_ring *ring = fence->ring; 826 827 if (atomic64_read(&ring->fence_drv.last_seq) >= fence->seq) 828 return false; 829 830 #ifdef __NetBSD__ 831 TAILQ_INSERT_TAIL(&ring->fence_drv.fence_check, fence, fence_check); 832 #else 833 fence->fence_wake.flags = 0; 834 fence->fence_wake.private = NULL; 835 fence->fence_wake.func = amdgpu_fence_check_signaled; 836 __add_wait_queue(&ring->fence_drv.fence_queue, &fence->fence_wake); 837 #endif 838 fence_get(f); 839 if (!timer_pending(&ring->fence_drv.fallback_timer)) 840 amdgpu_fence_schedule_fallback(ring); 841 FENCE_TRACE(&fence->base, "armed on ring %i!\n", ring->idx); 842 return true; 843 } 844 845 static void amdgpu_fence_release(struct fence *f) 846 { 847 struct amdgpu_fence *fence = to_amdgpu_fence(f); 848 kmem_cache_free(amdgpu_fence_slab, fence); 849 } 850 851 const struct fence_ops amdgpu_fence_ops = { 852 .get_driver_name = amdgpu_fence_get_driver_name, 853 .get_timeline_name = amdgpu_fence_get_timeline_name, 854 .enable_signaling = amdgpu_fence_enable_signaling, 855 .signaled = amdgpu_fence_is_signaled, 856 .wait = fence_default_wait, 857 .release = amdgpu_fence_release, 858 }; 859 860 /* 861 * Fence debugfs 862 */ 863 #if defined(CONFIG_DEBUG_FS) 864 static int amdgpu_debugfs_fence_info(struct seq_file *m, void *data) 865 { 866 struct drm_info_node *node = (struct drm_info_node *)m->private; 867 struct drm_device *dev = node->minor->dev; 868 struct amdgpu_device *adev = dev->dev_private; 869 int i, j; 870 871 for (i = 0; i < AMDGPU_MAX_RINGS; ++i) { 872 struct amdgpu_ring *ring = adev->rings[i]; 873 if (!ring || !ring->fence_drv.initialized) 874 continue; 875 876 amdgpu_fence_process(ring); 877 878 seq_printf(m, "--- ring %d (%s) ---\n", i, ring->name); 879 seq_printf(m, "Last signaled fence 0x%016llx\n", 880 (unsigned long long)atomic64_read(&ring->fence_drv.last_seq)); 881 seq_printf(m, "Last emitted 0x%016"PRIx64"\n", 882 ring->fence_drv.sync_seq[i]); 883 884 for (j = 0; j < AMDGPU_MAX_RINGS; ++j) { 885 struct amdgpu_ring *other = adev->rings[j]; 886 if (i != j && other && other->fence_drv.initialized && 887 ring->fence_drv.sync_seq[j]) 888 seq_printf(m, "Last sync to ring %d 0x%016"PRIx64"\n", 889 j, ring->fence_drv.sync_seq[j]); 890 } 891 } 892 return 0; 893 } 894 895 static struct drm_info_list amdgpu_debugfs_fence_list[] = { 896 {"amdgpu_fence_info", &amdgpu_debugfs_fence_info, 0, NULL}, 897 }; 898 #endif 899 900 int amdgpu_debugfs_fence_init(struct amdgpu_device *adev) 901 { 902 #if defined(CONFIG_DEBUG_FS) 903 return amdgpu_debugfs_add_files(adev, amdgpu_debugfs_fence_list, 1); 904 #else 905 return 0; 906 #endif 907 } 908 909