drm/amdgpu: drop the drm irq pre/post/un install callbacks
authorAlex Deucher <alexander.deucher@amd.com>
Fri, 19 Jan 2018 00:05:36 +0000 (19:05 -0500)
committerAlex Deucher <alexander.deucher@amd.com>
Mon, 19 Feb 2018 19:18:16 +0000 (14:18 -0500)
The preinstall callback didn't do anything because not all
of the IPs were initialized when it was called.

Move the postinstall setup into sequence in the driver.

The uninstall callback disabled all interrupt source, but
it got called too late in the driver sequence and caused problems
with IPs who already freed the relevant data structures.  Move
the call into the right place in the driver sequence.

Acked-by: Christian König <christian.koenig@amd.com>
Acked-by: Harry Wentland <harry.wentland@amd.com>
Tested-By: Mikita Lipski <mikita.lipski@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c
drivers/gpu/drm/amd/amdgpu/amdgpu_irq.h

index 113c92d562c36805d5226c077ec6c00d2e663675..309977ef5b51c32023f22900bb771beff6ce13a9 100644 (file)
@@ -1483,6 +1483,9 @@ static int amdgpu_device_ip_fini(struct amdgpu_device *adev)
                adev->ip_blocks[i].status.hw = false;
        }
 
+       /* disable all interrupts */
+       amdgpu_irq_disable_all(adev);
+
        for (i = adev->num_ip_blocks - 1; i >= 0; i--) {
                if (!adev->ip_blocks[i].status.sw)
                        continue;
index 24bc3e9203e2eb0db9cf3e879c7f6e6bdacc7657..ab4cb49175654866c59263e1d9ce97681685417c 100644 (file)
@@ -856,9 +856,6 @@ static struct drm_driver kms_driver = {
        .disable_vblank = amdgpu_disable_vblank_kms,
        .get_vblank_timestamp = drm_calc_vbltimestamp_from_scanoutpos,
        .get_scanout_position = amdgpu_get_crtc_scanout_position,
-       .irq_preinstall = amdgpu_irq_preinstall,
-       .irq_postinstall = amdgpu_irq_postinstall,
-       .irq_uninstall = amdgpu_irq_uninstall,
        .irq_handler = amdgpu_irq_handler,
        .ioctls = amdgpu_ioctls_kms,
        .gem_free_object_unlocked = amdgpu_gem_object_free,
index 56bcd59c3399a0a912ea1fa8f869c105b8827327..f6f2a662bb8f2b86de5c9afe23bb4380c0fab4ce 100644 (file)
@@ -92,7 +92,7 @@ static void amdgpu_irq_reset_work_func(struct work_struct *work)
 }
 
 /* Disable *all* interrupts */
-static void amdgpu_irq_disable_all(struct amdgpu_device *adev)
+void amdgpu_irq_disable_all(struct amdgpu_device *adev)
 {
        unsigned long irqflags;
        unsigned i, j, k;
@@ -122,55 +122,6 @@ static void amdgpu_irq_disable_all(struct amdgpu_device *adev)
        spin_unlock_irqrestore(&adev->irq.lock, irqflags);
 }
 
-/**
- * amdgpu_irq_preinstall - drm irq preinstall callback
- *
- * @dev: drm dev pointer
- *
- * Gets the hw ready to enable irqs (all asics).
- * This function disables all interrupt sources on the GPU.
- */
-void amdgpu_irq_preinstall(struct drm_device *dev)
-{
-       struct amdgpu_device *adev = dev->dev_private;
-
-       /* Disable *all* interrupts */
-       amdgpu_irq_disable_all(adev);
-       /* Clear bits */
-       amdgpu_ih_process(adev);
-}
-
-/**
- * amdgpu_irq_postinstall - drm irq preinstall callback
- *
- * @dev: drm dev pointer
- *
- * Handles stuff to be done after enabling irqs (all asics).
- * Returns 0 on success.
- */
-int amdgpu_irq_postinstall(struct drm_device *dev)
-{
-       dev->max_vblank_count = 0x00ffffff;
-       return 0;
-}
-
-/**
- * amdgpu_irq_uninstall - drm irq uninstall callback
- *
- * @dev: drm dev pointer
- *
- * This function disables all interrupt sources on the GPU (all asics).
- */
-void amdgpu_irq_uninstall(struct drm_device *dev)
-{
-       struct amdgpu_device *adev = dev->dev_private;
-
-       if (adev == NULL) {
-               return;
-       }
-       amdgpu_irq_disable_all(adev);
-}
-
 /**
  * amdgpu_irq_handler - irq handler
  *
@@ -261,6 +212,7 @@ int amdgpu_irq_init(struct amdgpu_device *adev)
                cancel_work_sync(&adev->reset_work);
                return r;
        }
+       adev->ddev->max_vblank_count = 0x00ffffff;
 
        DRM_DEBUG("amdgpu: irq initialized.\n");
        return 0;
index 0610cc4a97881619cd57661a5c3bfcd601c192de..3375ad778edce4723ad6b09ee5410933d91fe2db 100644 (file)
@@ -78,9 +78,7 @@ struct amdgpu_irq {
        uint32_t                        srbm_soft_reset;
 };
 
-void amdgpu_irq_preinstall(struct drm_device *dev);
-int amdgpu_irq_postinstall(struct drm_device *dev);
-void amdgpu_irq_uninstall(struct drm_device *dev);
+void amdgpu_irq_disable_all(struct amdgpu_device *adev);
 irqreturn_t amdgpu_irq_handler(int irq, void *arg);
 
 int amdgpu_irq_init(struct amdgpu_device *adev);