drm/radeon/kms: Don't try to process irq when we are unloading
[firefly-linux-kernel-4.4.55.git] / drivers / gpu / drm / radeon / r100.c
index 5708c07ce7331cbef157d22f609aeab54840cc46..4dd5ca50c0c554abe5faad7ec91903df75d7e3d9 100644 (file)
@@ -319,6 +319,9 @@ int r100_irq_process(struct radeon_device *rdev)
        if (!status) {
                return IRQ_NONE;
        }
+       if (rdev->shutdown) {
+               return IRQ_NONE;
+       }
        while (status) {
                /* SW interrupt */
                if (status & RADEON_SW_INT_TEST) {
@@ -487,6 +490,21 @@ int r100_copy_blit(struct radeon_device *rdev,
 /*
  * CP
  */
+static int r100_cp_wait_for_idle(struct radeon_device *rdev)
+{
+       unsigned i;
+       u32 tmp;
+
+       for (i = 0; i < rdev->usec_timeout; i++) {
+               tmp = RREG32(R_000E40_RBBM_STATUS);
+               if (!G_000E40_CP_CMDSTRM_BUSY(tmp)) {
+                       return 0;
+               }
+               udelay(1);
+       }
+       return -1;
+}
+
 void r100_ring_start(struct radeon_device *rdev)
 {
        int r;
@@ -715,9 +733,11 @@ int r100_cp_init(struct radeon_device *rdev, unsigned ring_size)
 
 void r100_cp_fini(struct radeon_device *rdev)
 {
+       if (r100_cp_wait_for_idle(rdev)) {
+               DRM_ERROR("Wait for CP idle timeout, shutting down CP.\n");
+       }
        /* Disable ring */
-       rdev->cp.ready = false;
-       WREG32(RADEON_CP_CSQ_CNTL, 0);
+       r100_cp_disable(rdev);
        radeon_ring_fini(rdev);
        DRM_INFO("radeon: cp finalized\n");
 }