hc
2024-05-10 9999e48639b3cecb08ffb37358bcba3b48161b29
kernel/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c
....@@ -34,7 +34,10 @@
3434 #include <linux/kref.h>
3535 #include <linux/slab.h>
3636 #include <linux/firmware.h>
37
-#include <drm/drmP.h>
37
+#include <linux/pm_runtime.h>
38
+
39
+#include <drm/drm_debugfs.h>
40
+
3841 #include "amdgpu.h"
3942 #include "amdgpu_trace.h"
4043
....@@ -152,7 +155,7 @@
152155 seq);
153156 amdgpu_ring_emit_fence(ring, ring->fence_drv.gpu_addr,
154157 seq, flags | AMDGPU_FENCE_FLAG_INT);
155
-
158
+ pm_runtime_get_noresume(adev_to_drm(adev)->dev);
156159 ptr = &ring->fence_drv.fences[seq & ring->fence_drv.num_fences_mask];
157160 if (unlikely(rcu_dereference_protected(*ptr, 1))) {
158161 struct dma_fence *old;
....@@ -189,14 +192,22 @@
189192 * Used For polling fence.
190193 * Returns 0 on success, -ENOMEM on failure.
191194 */
192
-int amdgpu_fence_emit_polling(struct amdgpu_ring *ring, uint32_t *s)
195
+int amdgpu_fence_emit_polling(struct amdgpu_ring *ring, uint32_t *s,
196
+ uint32_t timeout)
193197 {
194198 uint32_t seq;
199
+ signed long r;
195200
196201 if (!s)
197202 return -EINVAL;
198203
199204 seq = ++ring->fence_drv.sync_seq;
205
+ r = amdgpu_fence_wait_polling(ring,
206
+ seq - ring->fence_drv.num_fences_mask,
207
+ timeout);
208
+ if (r < 1)
209
+ return -ETIMEDOUT;
210
+
200211 amdgpu_ring_emit_fence(ring, ring->fence_drv.gpu_addr,
201212 seq, 0);
202213
....@@ -226,10 +237,13 @@
226237 * Checks the current fence value and calculates the last
227238 * signalled fence value. Wakes the fence queue if the
228239 * sequence number has increased.
240
+ *
241
+ * Returns true if fence was processed
229242 */
230
-void amdgpu_fence_process(struct amdgpu_ring *ring)
243
+bool amdgpu_fence_process(struct amdgpu_ring *ring)
231244 {
232245 struct amdgpu_fence_driver *drv = &ring->fence_drv;
246
+ struct amdgpu_device *adev = ring->adev;
233247 uint32_t seq, last_seq;
234248 int r;
235249
....@@ -239,11 +253,12 @@
239253
240254 } while (atomic_cmpxchg(&drv->last_seq, last_seq, seq) != last_seq);
241255
242
- if (seq != ring->fence_drv.sync_seq)
256
+ if (del_timer(&ring->fence_drv.fallback_timer) &&
257
+ seq != ring->fence_drv.sync_seq)
243258 amdgpu_fence_schedule_fallback(ring);
244259
245260 if (unlikely(seq == last_seq))
246
- return;
261
+ return false;
247262
248263 last_seq &= drv->num_fences_mask;
249264 seq &= drv->num_fences_mask;
....@@ -269,7 +284,11 @@
269284 BUG();
270285
271286 dma_fence_put(fence);
287
+ pm_runtime_mark_last_busy(adev_to_drm(adev)->dev);
288
+ pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
272289 } while (last_seq != seq);
290
+
291
+ return true;
273292 }
274293
275294 /**
....@@ -284,7 +303,8 @@
284303 struct amdgpu_ring *ring = from_timer(ring, t,
285304 fence_drv.fallback_timer);
286305
287
- amdgpu_fence_process(ring);
306
+ if (amdgpu_fence_process(ring))
307
+ DRM_WARN("Fence fallback timer expired on ring %s\n", ring->name);
288308 }
289309
290310 /**
....@@ -404,9 +424,8 @@
404424 ring->fence_drv.irq_type = irq_type;
405425 ring->fence_drv.initialized = true;
406426
407
- dev_dbg(adev->dev, "fence driver on ring %d use gpu addr 0x%016llx, "
408
- "cpu addr 0x%p\n", ring->idx,
409
- ring->fence_drv.gpu_addr, ring->fence_drv.cpu_addr);
427
+ DRM_DEV_DEBUG(adev->dev, "fence driver on ring %s use gpu addr 0x%016llx\n",
428
+ ring->name, ring->fence_drv.gpu_addr);
410429 return 0;
411430 }
412431
....@@ -423,11 +442,14 @@
423442 int amdgpu_fence_driver_init_ring(struct amdgpu_ring *ring,
424443 unsigned num_hw_submission)
425444 {
445
+ struct amdgpu_device *adev = ring->adev;
426446 long timeout;
427447 int r;
428448
429
- /* Check that num_hw_submission is a power of two */
430
- if ((num_hw_submission & (num_hw_submission - 1)) != 0)
449
+ if (!adev)
450
+ return -EINVAL;
451
+
452
+ if (!is_power_of_2(num_hw_submission))
431453 return -EINVAL;
432454
433455 ring->fence_drv.cpu_addr = NULL;
....@@ -445,14 +467,22 @@
445467 if (!ring->fence_drv.fences)
446468 return -ENOMEM;
447469
448
- /* No need to setup the GPU scheduler for KIQ ring */
449
- if (ring->funcs->type != AMDGPU_RING_TYPE_KIQ) {
450
- /* for non-sriov case, no timeout enforce on compute ring */
451
- if ((ring->funcs->type == AMDGPU_RING_TYPE_COMPUTE)
452
- && !amdgpu_sriov_vf(ring->adev))
453
- timeout = MAX_SCHEDULE_TIMEOUT;
454
- else
455
- timeout = msecs_to_jiffies(amdgpu_lockup_timeout);
470
+ /* No need to setup the GPU scheduler for rings that don't need it */
471
+ if (!ring->no_scheduler) {
472
+ switch (ring->funcs->type) {
473
+ case AMDGPU_RING_TYPE_GFX:
474
+ timeout = adev->gfx_timeout;
475
+ break;
476
+ case AMDGPU_RING_TYPE_COMPUTE:
477
+ timeout = adev->compute_timeout;
478
+ break;
479
+ case AMDGPU_RING_TYPE_SDMA:
480
+ timeout = adev->sdma_timeout;
481
+ break;
482
+ default:
483
+ timeout = adev->video_timeout;
484
+ break;
485
+ }
456486
457487 r = drm_sched_init(&ring->sched, &amdgpu_sched_ops,
458488 num_hw_submission, amdgpu_job_hang_limit,
....@@ -481,9 +511,6 @@
481511 */
482512 int amdgpu_fence_driver_init(struct amdgpu_device *adev)
483513 {
484
- if (amdgpu_debugfs_fence_init(adev))
485
- dev_err(adev->dev, "fence debugfs file creation failed\n");
486
-
487514 return 0;
488515 }
489516
....@@ -505,6 +532,8 @@
505532
506533 if (!ring || !ring->fence_drv.initialized)
507534 continue;
535
+ if (!ring->no_scheduler)
536
+ drm_sched_fini(&ring->sched);
508537 r = amdgpu_fence_wait_empty(ring);
509538 if (r) {
510539 /* no need to trigger GPU reset as we are unloading */
....@@ -513,7 +542,7 @@
513542 if (ring->fence_drv.irq_src)
514543 amdgpu_irq_put(adev, ring->fence_drv.irq_src,
515544 ring->fence_drv.irq_type);
516
- drm_sched_fini(&ring->sched);
545
+
517546 del_timer_sync(&ring->fence_drv.fallback_timer);
518547 for (j = 0; j <= ring->fence_drv.num_fences_mask; ++j)
519548 dma_fence_put(ring->fence_drv.fences[j]);
....@@ -672,7 +701,7 @@
672701 {
673702 struct drm_info_node *node = (struct drm_info_node *)m->private;
674703 struct drm_device *dev = node->minor->dev;
675
- struct amdgpu_device *adev = dev->dev_private;
704
+ struct amdgpu_device *adev = drm_to_adev(dev);
676705 int i;
677706
678707 for (i = 0; i < AMDGPU_MAX_RINGS; ++i) {
....@@ -683,22 +712,30 @@
683712 amdgpu_fence_process(ring);
684713
685714 seq_printf(m, "--- ring %d (%s) ---\n", i, ring->name);
686
- seq_printf(m, "Last signaled fence 0x%08x\n",
715
+ seq_printf(m, "Last signaled fence 0x%08x\n",
687716 atomic_read(&ring->fence_drv.last_seq));
688
- seq_printf(m, "Last emitted 0x%08x\n",
717
+ seq_printf(m, "Last emitted 0x%08x\n",
689718 ring->fence_drv.sync_seq);
719
+
720
+ if (ring->funcs->type == AMDGPU_RING_TYPE_GFX ||
721
+ ring->funcs->type == AMDGPU_RING_TYPE_SDMA) {
722
+ seq_printf(m, "Last signaled trailing fence 0x%08x\n",
723
+ le32_to_cpu(*ring->trail_fence_cpu_addr));
724
+ seq_printf(m, "Last emitted 0x%08x\n",
725
+ ring->trail_seq);
726
+ }
690727
691728 if (ring->funcs->type != AMDGPU_RING_TYPE_GFX)
692729 continue;
693730
694731 /* set in CP_VMID_PREEMPT and preemption occurred */
695
- seq_printf(m, "Last preempted 0x%08x\n",
732
+ seq_printf(m, "Last preempted 0x%08x\n",
696733 le32_to_cpu(*(ring->fence_drv.cpu_addr + 2)));
697734 /* set in CP_VMID_RESET and reset occurred */
698
- seq_printf(m, "Last reset 0x%08x\n",
735
+ seq_printf(m, "Last reset 0x%08x\n",
699736 le32_to_cpu(*(ring->fence_drv.cpu_addr + 4)));
700737 /* Both preemption and reset occurred */
701
- seq_printf(m, "Last both 0x%08x\n",
738
+ seq_printf(m, "Last both 0x%08x\n",
702739 le32_to_cpu(*(ring->fence_drv.cpu_addr + 6)));
703740 }
704741 return 0;
....@@ -713,10 +750,20 @@
713750 {
714751 struct drm_info_node *node = (struct drm_info_node *) m->private;
715752 struct drm_device *dev = node->minor->dev;
716
- struct amdgpu_device *adev = dev->dev_private;
753
+ struct amdgpu_device *adev = drm_to_adev(dev);
754
+ int r;
755
+
756
+ r = pm_runtime_get_sync(dev->dev);
757
+ if (r < 0) {
758
+ pm_runtime_put_autosuspend(dev->dev);
759
+ return 0;
760
+ }
717761
718762 seq_printf(m, "gpu recover\n");
719
- amdgpu_device_gpu_recover(adev, NULL, true);
763
+ amdgpu_device_gpu_recover(adev, NULL);
764
+
765
+ pm_runtime_mark_last_busy(dev->dev);
766
+ pm_runtime_put_autosuspend(dev->dev);
720767
721768 return 0;
722769 }
....@@ -735,8 +782,10 @@
735782 {
736783 #if defined(CONFIG_DEBUG_FS)
737784 if (amdgpu_sriov_vf(adev))
738
- return amdgpu_debugfs_add_files(adev, amdgpu_debugfs_fence_list_sriov, 1);
739
- return amdgpu_debugfs_add_files(adev, amdgpu_debugfs_fence_list, 2);
785
+ return amdgpu_debugfs_add_files(adev, amdgpu_debugfs_fence_list_sriov,
786
+ ARRAY_SIZE(amdgpu_debugfs_fence_list_sriov));
787
+ return amdgpu_debugfs_add_files(adev, amdgpu_debugfs_fence_list,
788
+ ARRAY_SIZE(amdgpu_debugfs_fence_list));
740789 #else
741790 return 0;
742791 #endif