Lines Matching full:ring

48  * are no longer in use by the associated ring on the GPU and
56 struct amdgpu_ring *ring; member
96 * @ring: ring the fence is associated with
101 static void amdgpu_fence_write(struct amdgpu_ring *ring, u32 seq) in amdgpu_fence_write() argument
103 struct amdgpu_fence_driver *drv = &ring->fence_drv; in amdgpu_fence_write()
112 * @ring: ring the fence is associated with
117 static u32 amdgpu_fence_read(struct amdgpu_ring *ring) in amdgpu_fence_read() argument
119 struct amdgpu_fence_driver *drv = &ring->fence_drv; in amdgpu_fence_read()
131 * amdgpu_fence_emit - emit a fence on the requested ring
133 * @ring: ring the fence is associated with
138 * Emits a fence command on the requested ring (all asics).
141 int amdgpu_fence_emit(struct amdgpu_ring *ring, struct dma_fence **f, struct amdgpu_job *job, in amdgpu_fence_emit() argument
144 struct amdgpu_device *adev = ring->adev; in amdgpu_fence_emit()
157 am_fence->ring = ring; in amdgpu_fence_emit()
163 seq = ++ring->fence_drv.sync_seq; in amdgpu_fence_emit()
172 &ring->fence_drv.lock, in amdgpu_fence_emit()
173 adev->fence_context + ring->idx, seq); in amdgpu_fence_emit()
178 &ring->fence_drv.lock, in amdgpu_fence_emit()
179 adev->fence_context + ring->idx, seq); in amdgpu_fence_emit()
183 amdgpu_ring_emit_fence(ring, ring->fence_drv.gpu_addr, in amdgpu_fence_emit()
186 ptr = &ring->fence_drv.fences[seq & ring->fence_drv.num_fences_mask]; in amdgpu_fence_emit()
205 * emitting the fence would mess up the hardware ring buffer. in amdgpu_fence_emit()
215 * amdgpu_fence_emit_polling - emit a fence on the requeste ring
217 * @ring: ring the fence is associated with
221 * Emits a fence command on the requested ring (all asics).
225 int amdgpu_fence_emit_polling(struct amdgpu_ring *ring, uint32_t *s, in amdgpu_fence_emit_polling() argument
234 seq = ++ring->fence_drv.sync_seq; in amdgpu_fence_emit_polling()
235 r = amdgpu_fence_wait_polling(ring, in amdgpu_fence_emit_polling()
236 seq - ring->fence_drv.num_fences_mask, in amdgpu_fence_emit_polling()
241 amdgpu_ring_emit_fence(ring, ring->fence_drv.gpu_addr, in amdgpu_fence_emit_polling()
252 * @ring: pointer to struct amdgpu_ring
256 static void amdgpu_fence_schedule_fallback(struct amdgpu_ring *ring) in amdgpu_fence_schedule_fallback() argument
258 mod_timer(&ring->fence_drv.fallback_timer, in amdgpu_fence_schedule_fallback()
265 * @ring: pointer to struct amdgpu_ring
273 bool amdgpu_fence_process(struct amdgpu_ring *ring) in amdgpu_fence_process() argument
275 struct amdgpu_fence_driver *drv = &ring->fence_drv; in amdgpu_fence_process()
276 struct amdgpu_device *adev = ring->adev; in amdgpu_fence_process()
280 last_seq = atomic_read(&ring->fence_drv.last_seq); in amdgpu_fence_process()
281 seq = amdgpu_fence_read(ring); in amdgpu_fence_process()
285 if (del_timer(&ring->fence_drv.fallback_timer) && in amdgpu_fence_process()
286 seq != ring->fence_drv.sync_seq) in amdgpu_fence_process()
287 amdgpu_fence_schedule_fallback(ring); in amdgpu_fence_process()
321 * @t: timer context used to obtain the pointer to ring structure
327 struct amdgpu_ring *ring = from_timer(ring, t, in amdgpu_fence_fallback() local
330 if (amdgpu_fence_process(ring)) in amdgpu_fence_fallback()
331 DRM_WARN("Fence fallback timer expired on ring %s\n", ring->name); in amdgpu_fence_fallback()
337 * @ring: ring index the fence is associated with
339 * Wait for all fences on the requested ring to signal (all asics).
342 int amdgpu_fence_wait_empty(struct amdgpu_ring *ring) in amdgpu_fence_wait_empty() argument
344 uint64_t seq = READ_ONCE(ring->fence_drv.sync_seq); in amdgpu_fence_wait_empty()
351 ptr = &ring->fence_drv.fences[seq & ring->fence_drv.num_fences_mask]; in amdgpu_fence_wait_empty()
368 * @ring: ring index the fence is associated with
372 * Wait for all fences on the requested ring to signal (all asics).
375 signed long amdgpu_fence_wait_polling(struct amdgpu_ring *ring, in amdgpu_fence_wait_polling() argument
380 while ((int32_t)(wait_seq - amdgpu_fence_read(ring)) > 0 && timeout > 0) { in amdgpu_fence_wait_polling()
389 * @ring: ring the fence is associated with
391 * Get the number of fences emitted on the requested ring (all asics).
392 * Returns the number of emitted fences on the ring. Used by the
393 * dynpm code to ring track activity.
395 unsigned int amdgpu_fence_count_emitted(struct amdgpu_ring *ring) in amdgpu_fence_count_emitted() argument
399 /* We are not protected by ring lock when reading the last sequence in amdgpu_fence_count_emitted()
403 emitted -= atomic_read(&ring->fence_drv.last_seq); in amdgpu_fence_count_emitted()
404 emitted += READ_ONCE(ring->fence_drv.sync_seq); in amdgpu_fence_count_emitted()
410 * @ring: ring the fence is associated with
415 u64 amdgpu_fence_last_unsignaled_time_us(struct amdgpu_ring *ring) in amdgpu_fence_last_unsignaled_time_us() argument
417 struct amdgpu_fence_driver *drv = &ring->fence_drv; in amdgpu_fence_last_unsignaled_time_us()
421 last_seq = atomic_read(&ring->fence_drv.last_seq); in amdgpu_fence_last_unsignaled_time_us()
422 sync_seq = READ_ONCE(ring->fence_drv.sync_seq); in amdgpu_fence_last_unsignaled_time_us()
438 * @ring: ring the fence is associated with
446 void amdgpu_fence_update_start_timestamp(struct amdgpu_ring *ring, uint32_t seq, ktime_t timestamp) in amdgpu_fence_update_start_timestamp() argument
448 struct amdgpu_fence_driver *drv = &ring->fence_drv; in amdgpu_fence_update_start_timestamp()
461 * ready for use on the requested ring.
463 * @ring: ring to start the fence driver on
464 * @irq_src: interrupt source to use for this ring
465 * @irq_type: interrupt type to use for this ring
472 int amdgpu_fence_driver_start_ring(struct amdgpu_ring *ring, in amdgpu_fence_driver_start_ring() argument
476 struct amdgpu_device *adev = ring->adev; in amdgpu_fence_driver_start_ring()
479 if (ring->funcs->type != AMDGPU_RING_TYPE_UVD) { in amdgpu_fence_driver_start_ring()
480 ring->fence_drv.cpu_addr = ring->fence_cpu_addr; in amdgpu_fence_driver_start_ring()
481 ring->fence_drv.gpu_addr = ring->fence_gpu_addr; in amdgpu_fence_driver_start_ring()
485 ring->fence_drv.cpu_addr = adev->uvd.inst[ring->me].cpu_addr + index; in amdgpu_fence_driver_start_ring()
486 ring->fence_drv.gpu_addr = adev->uvd.inst[ring->me].gpu_addr + index; in amdgpu_fence_driver_start_ring()
488 amdgpu_fence_write(ring, atomic_read(&ring->fence_drv.last_seq)); in amdgpu_fence_driver_start_ring()
490 ring->fence_drv.irq_src = irq_src; in amdgpu_fence_driver_start_ring()
491 ring->fence_drv.irq_type = irq_type; in amdgpu_fence_driver_start_ring()
492 ring->fence_drv.initialized = true; in amdgpu_fence_driver_start_ring()
494 DRM_DEV_DEBUG(adev->dev, "fence driver on ring %s use gpu addr 0x%016llx\n", in amdgpu_fence_driver_start_ring()
495 ring->name, ring->fence_drv.gpu_addr); in amdgpu_fence_driver_start_ring()
501 * for the requested ring.
503 * @ring: ring to init the fence driver on
505 * Init the fence driver for the requested ring (all asics).
508 int amdgpu_fence_driver_init_ring(struct amdgpu_ring *ring) in amdgpu_fence_driver_init_ring() argument
510 struct amdgpu_device *adev = ring->adev; in amdgpu_fence_driver_init_ring()
515 if (!is_power_of_2(ring->num_hw_submission)) in amdgpu_fence_driver_init_ring()
518 ring->fence_drv.cpu_addr = NULL; in amdgpu_fence_driver_init_ring()
519 ring->fence_drv.gpu_addr = 0; in amdgpu_fence_driver_init_ring()
520 ring->fence_drv.sync_seq = 0; in amdgpu_fence_driver_init_ring()
521 atomic_set(&ring->fence_drv.last_seq, 0); in amdgpu_fence_driver_init_ring()
522 ring->fence_drv.initialized = false; in amdgpu_fence_driver_init_ring()
524 timer_setup(&ring->fence_drv.fallback_timer, amdgpu_fence_fallback, 0); in amdgpu_fence_driver_init_ring()
526 ring->fence_drv.num_fences_mask = ring->num_hw_submission * 2 - 1; in amdgpu_fence_driver_init_ring()
527 spin_lock_init(&ring->fence_drv.lock); in amdgpu_fence_driver_init_ring()
528 ring->fence_drv.fences = kcalloc(ring->num_hw_submission * 2, sizeof(void *), in amdgpu_fence_driver_init_ring()
531 if (!ring->fence_drv.fences) in amdgpu_fence_driver_init_ring()
558 * @ring: ring that to be checked
565 static bool amdgpu_fence_need_ring_interrupt_restore(struct amdgpu_ring *ring) in amdgpu_fence_need_ring_interrupt_restore() argument
567 struct amdgpu_device *adev = ring->adev; in amdgpu_fence_need_ring_interrupt_restore()
570 switch (ring->funcs->type) { in amdgpu_fence_need_ring_interrupt_restore()
602 struct amdgpu_ring *ring = adev->rings[i]; in amdgpu_fence_driver_hw_fini() local
604 if (!ring || !ring->fence_drv.initialized) in amdgpu_fence_driver_hw_fini()
609 r = amdgpu_fence_wait_empty(ring); in amdgpu_fence_driver_hw_fini()
614 amdgpu_fence_driver_force_completion(ring); in amdgpu_fence_driver_hw_fini()
617 ring->fence_drv.irq_src && in amdgpu_fence_driver_hw_fini()
618 amdgpu_fence_need_ring_interrupt_restore(ring)) in amdgpu_fence_driver_hw_fini()
619 amdgpu_irq_put(adev, ring->fence_drv.irq_src, in amdgpu_fence_driver_hw_fini()
620 ring->fence_drv.irq_type); in amdgpu_fence_driver_hw_fini()
622 del_timer_sync(&ring->fence_drv.fallback_timer); in amdgpu_fence_driver_hw_fini()
632 struct amdgpu_ring *ring = adev->rings[i]; in amdgpu_fence_driver_isr_toggle() local
634 if (!ring || !ring->fence_drv.initialized || !ring->fence_drv.irq_src) in amdgpu_fence_driver_isr_toggle()
649 struct amdgpu_ring *ring = adev->rings[i]; in amdgpu_fence_driver_sw_fini() local
651 if (!ring || !ring->fence_drv.initialized) in amdgpu_fence_driver_sw_fini()
660 if (ring->sched.ops) in amdgpu_fence_driver_sw_fini()
661 drm_sched_fini(&ring->sched); in amdgpu_fence_driver_sw_fini()
663 for (j = 0; j <= ring->fence_drv.num_fences_mask; ++j) in amdgpu_fence_driver_sw_fini()
664 dma_fence_put(ring->fence_drv.fences[j]); in amdgpu_fence_driver_sw_fini()
665 kfree(ring->fence_drv.fences); in amdgpu_fence_driver_sw_fini()
666 ring->fence_drv.fences = NULL; in amdgpu_fence_driver_sw_fini()
667 ring->fence_drv.initialized = false; in amdgpu_fence_driver_sw_fini()
688 struct amdgpu_ring *ring = adev->rings[i]; in amdgpu_fence_driver_hw_init() local
690 if (!ring || !ring->fence_drv.initialized) in amdgpu_fence_driver_hw_init()
694 if (ring->fence_drv.irq_src && in amdgpu_fence_driver_hw_init()
695 amdgpu_fence_need_ring_interrupt_restore(ring)) in amdgpu_fence_driver_hw_init()
696 amdgpu_irq_get(adev, ring->fence_drv.irq_src, in amdgpu_fence_driver_hw_init()
697 ring->fence_drv.irq_type); in amdgpu_fence_driver_hw_init()
702 * amdgpu_fence_driver_clear_job_fences - clear job embedded fences of ring
704 * @ring: fence of the ring to be cleared
707 void amdgpu_fence_driver_clear_job_fences(struct amdgpu_ring *ring) in amdgpu_fence_driver_clear_job_fences() argument
712 for (i = 0; i <= ring->fence_drv.num_fences_mask; i++) { in amdgpu_fence_driver_clear_job_fences()
713 ptr = &ring->fence_drv.fences[i]; in amdgpu_fence_driver_clear_job_fences()
733 * @ring: the ring which contains the fences
736 * Set an error code to all the fences pending on the ring.
738 void amdgpu_fence_driver_set_error(struct amdgpu_ring *ring, int error) in amdgpu_fence_driver_set_error() argument
740 struct amdgpu_fence_driver *drv = &ring->fence_drv; in amdgpu_fence_driver_set_error()
756 * amdgpu_fence_driver_force_completion - force signal latest fence of ring
758 * @ring: fence of the ring to signal
761 void amdgpu_fence_driver_force_completion(struct amdgpu_ring *ring) in amdgpu_fence_driver_force_completion() argument
763 amdgpu_fence_driver_set_error(ring, -ECANCELED); in amdgpu_fence_driver_force_completion()
764 amdgpu_fence_write(ring, ring->fence_drv.sync_seq); in amdgpu_fence_driver_force_completion()
765 amdgpu_fence_process(ring); in amdgpu_fence_driver_force_completion()
779 return (const char *)to_amdgpu_fence(f)->ring->name; in amdgpu_fence_get_timeline_name()
799 if (!timer_pending(&to_amdgpu_fence(f)->ring->fence_drv.fallback_timer)) in amdgpu_fence_enable_signaling()
800 amdgpu_fence_schedule_fallback(to_amdgpu_fence(f)->ring); in amdgpu_fence_enable_signaling()
902 struct amdgpu_ring *ring = adev->rings[i]; in amdgpu_debugfs_fence_info_show() local
904 if (!ring || !ring->fence_drv.initialized) in amdgpu_debugfs_fence_info_show()
907 amdgpu_fence_process(ring); in amdgpu_debugfs_fence_info_show()
909 seq_printf(m, "--- ring %d (%s) ---\n", i, ring->name); in amdgpu_debugfs_fence_info_show()
911 atomic_read(&ring->fence_drv.last_seq)); in amdgpu_debugfs_fence_info_show()
913 ring->fence_drv.sync_seq); in amdgpu_debugfs_fence_info_show()
915 if (ring->funcs->type == AMDGPU_RING_TYPE_GFX || in amdgpu_debugfs_fence_info_show()
916 ring->funcs->type == AMDGPU_RING_TYPE_SDMA) { in amdgpu_debugfs_fence_info_show()
918 le32_to_cpu(*ring->trail_fence_cpu_addr)); in amdgpu_debugfs_fence_info_show()
920 ring->trail_seq); in amdgpu_debugfs_fence_info_show()
923 if (ring->funcs->type != AMDGPU_RING_TYPE_GFX) in amdgpu_debugfs_fence_info_show()
928 le32_to_cpu(*(ring->fence_drv.cpu_addr + 2))); in amdgpu_debugfs_fence_info_show()
931 le32_to_cpu(*(ring->fence_drv.cpu_addr + 4))); in amdgpu_debugfs_fence_info_show()
934 le32_to_cpu(*(ring->fence_drv.cpu_addr + 6))); in amdgpu_debugfs_fence_info_show()