]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/blobdiff - drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c
Merge tag 'rpmsg-v5.9' of git://git.kernel.org/pub/scm/linux/kernel/git/andersson...
[mirror_ubuntu-jammy-kernel.git] / drivers / gpu / drm / amd / amdgpu / amdgpu_fence.c
index d878fe7fee51cc6c44b2475800da30b9c7e97619..58d4c219178a29593592197beed39abfa8bfef48 100644 (file)
@@ -416,15 +416,16 @@ int amdgpu_fence_driver_start_ring(struct amdgpu_ring *ring,
                ring->fence_drv.gpu_addr = adev->uvd.inst[ring->me].gpu_addr + index;
        }
        amdgpu_fence_write(ring, atomic_read(&ring->fence_drv.last_seq));
-       amdgpu_irq_get(adev, irq_src, irq_type);
+
+       if (irq_src)
+               amdgpu_irq_get(adev, irq_src, irq_type);
 
        ring->fence_drv.irq_src = irq_src;
        ring->fence_drv.irq_type = irq_type;
        ring->fence_drv.initialized = true;
 
-       DRM_DEV_DEBUG(adev->dev, "fence driver on ring %s use gpu addr "
-                     "0x%016llx, cpu addr 0x%p\n", ring->name,
-                     ring->fence_drv.gpu_addr, ring->fence_drv.cpu_addr);
+       DRM_DEV_DEBUG(adev->dev, "fence driver on ring %s use gpu addr 0x%016llx\n",
+                     ring->name, ring->fence_drv.gpu_addr);
        return 0;
 }
 
@@ -448,8 +449,7 @@ int amdgpu_fence_driver_init_ring(struct amdgpu_ring *ring,
        if (!adev)
                return -EINVAL;
 
-       /* Check that num_hw_submission is a power of two */
-       if ((num_hw_submission & (num_hw_submission - 1)) != 0)
+       if (!is_power_of_2(num_hw_submission))
                return -EINVAL;
 
        ring->fence_drv.cpu_addr = NULL;
@@ -467,8 +467,8 @@ int amdgpu_fence_driver_init_ring(struct amdgpu_ring *ring,
        if (!ring->fence_drv.fences)
                return -ENOMEM;
 
-       /* No need to setup the GPU scheduler for KIQ ring */
-       if (ring->funcs->type != AMDGPU_RING_TYPE_KIQ) {
+       /* No need to setup the GPU scheduler for rings that don't need it */
+       if (!ring->no_scheduler) {
                switch (ring->funcs->type) {
                case AMDGPU_RING_TYPE_GFX:
                        timeout = adev->gfx_timeout;
@@ -537,9 +537,11 @@ void amdgpu_fence_driver_fini(struct amdgpu_device *adev)
                        /* no need to trigger GPU reset as we are unloading */
                        amdgpu_fence_driver_force_completion(ring);
                }
-               amdgpu_irq_put(adev, ring->fence_drv.irq_src,
-                              ring->fence_drv.irq_type);
-               drm_sched_fini(&ring->sched);
+               if (ring->fence_drv.irq_src)
+                       amdgpu_irq_put(adev, ring->fence_drv.irq_src,
+                                      ring->fence_drv.irq_type);
+               if (!ring->no_scheduler)
+                       drm_sched_fini(&ring->sched);
                del_timer_sync(&ring->fence_drv.fallback_timer);
                for (j = 0; j <= ring->fence_drv.num_fences_mask; ++j)
                        dma_fence_put(ring->fence_drv.fences[j]);
@@ -574,8 +576,9 @@ void amdgpu_fence_driver_suspend(struct amdgpu_device *adev)
                }
 
                /* disable the interrupt */
-               amdgpu_irq_put(adev, ring->fence_drv.irq_src,
-                              ring->fence_drv.irq_type);
+               if (ring->fence_drv.irq_src)
+                       amdgpu_irq_put(adev, ring->fence_drv.irq_src,
+                                      ring->fence_drv.irq_type);
        }
 }
 
@@ -601,8 +604,9 @@ void amdgpu_fence_driver_resume(struct amdgpu_device *adev)
                        continue;
 
                /* enable the interrupt */
-               amdgpu_irq_get(adev, ring->fence_drv.irq_src,
-                              ring->fence_drv.irq_type);
+               if (ring->fence_drv.irq_src)
+                       amdgpu_irq_get(adev, ring->fence_drv.irq_src,
+                                      ring->fence_drv.irq_type);
        }
 }
 
@@ -749,8 +753,10 @@ static int amdgpu_debugfs_gpu_recover(struct seq_file *m, void *data)
        int r;
 
        r = pm_runtime_get_sync(dev->dev);
-       if (r < 0)
+       if (r < 0) {
+               pm_runtime_put_autosuspend(dev->dev);
                return 0;
+       }
 
        seq_printf(m, "gpu recover\n");
        amdgpu_device_gpu_recover(adev, NULL);
@@ -775,8 +781,10 @@ int amdgpu_debugfs_fence_init(struct amdgpu_device *adev)
 {
 #if defined(CONFIG_DEBUG_FS)
        if (amdgpu_sriov_vf(adev))
-               return amdgpu_debugfs_add_files(adev, amdgpu_debugfs_fence_list_sriov, 1);
-       return amdgpu_debugfs_add_files(adev, amdgpu_debugfs_fence_list, 2);
+               return amdgpu_debugfs_add_files(adev, amdgpu_debugfs_fence_list_sriov,
+                                               ARRAY_SIZE(amdgpu_debugfs_fence_list_sriov));
+       return amdgpu_debugfs_add_files(adev, amdgpu_debugfs_fence_list,
+                                       ARRAY_SIZE(amdgpu_debugfs_fence_list));
 #else
        return 0;
 #endif