drm/radeon: replace gpu_lockup with ring->ready flag
authorChristian König <deathsimple@vodafone.de>
Wed, 2 May 2012 13:11:10 +0000 (15:11 +0200)
committerDave Airlie <airlied@redhat.com>
Thu, 3 May 2012 08:16:03 +0000 (09:16 +0100)
It makes no sense at all to have more than one flag.

Signed-off-by: Christian König <deathsimple@vodafone.de>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Reviewed-by: Jerome Glisse <jglisse@redhat.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
drivers/gpu/drm/radeon/r100.c
drivers/gpu/drm/radeon/r300.c
drivers/gpu/drm/radeon/radeon.h
drivers/gpu/drm/radeon/radeon_device.c
drivers/gpu/drm/radeon/radeon_fence.c
drivers/gpu/drm/radeon/rs600.c

index cb11418..a0b44a5 100644 (file)
@@ -2300,7 +2300,6 @@ int r100_asic_reset(struct radeon_device *rdev)
        if (G_000E40_SE_BUSY(status) || G_000E40_RE_BUSY(status) ||
                G_000E40_TAM_BUSY(status) || G_000E40_PB_BUSY(status)) {
                dev_err(rdev->dev, "failed to reset GPU\n");
-               rdev->gpu_lockup = true;
                ret = -1;
        } else
                dev_info(rdev->dev, "GPU reset succeed\n");
index fa14383..a63f432 100644 (file)
@@ -449,7 +449,6 @@ int r300_asic_reset(struct radeon_device *rdev)
        /* Check if GPU is idle */
        if (G_000E40_GA_BUSY(status) || G_000E40_VAP_BUSY(status)) {
                dev_err(rdev->dev, "failed to reset GPU\n");
-               rdev->gpu_lockup = true;
                ret = -1;
        } else
                dev_info(rdev->dev, "GPU reset succeed\n");
index 4026a4c..c76724b 100644 (file)
@@ -1547,7 +1547,6 @@ struct radeon_device {
        struct radeon_mutex             cs_mutex;
        struct radeon_wb                wb;
        struct radeon_dummy_page        dummy_page;
-       bool                            gpu_lockup;
        bool                            shutdown;
        bool                            suspend;
        bool                            need_dma32;
index 0fb4f89..dedb398 100644 (file)
@@ -714,7 +714,6 @@ int radeon_device_init(struct radeon_device *rdev,
        rdev->is_atom_bios = false;
        rdev->usec_timeout = RADEON_MAX_USEC_TIMEOUT;
        rdev->mc.gtt_size = radeon_gart_size * 1024 * 1024;
-       rdev->gpu_lockup = false;
        rdev->accel_working = false;
 
        DRM_INFO("initializing kernel modesetting (%s 0x%04X:0x%04X 0x%04X:0x%04X).\n",
index 66b2229..36c411f 100644 (file)
@@ -71,14 +71,7 @@ int radeon_fence_emit(struct radeon_device *rdev, struct radeon_fence *fence)
                return 0;
        }
        fence->seq = atomic_add_return(1, &rdev->fence_drv[fence->ring].seq);
-       if (!rdev->ring[fence->ring].ready)
-               /* FIXME: cp is not running assume everythings is done right
-                * away
-                */
-               radeon_fence_write(rdev, fence->seq, fence->ring);
-       else
-               radeon_fence_ring_emit(rdev, fence->ring, fence);
-
+       radeon_fence_ring_emit(rdev, fence->ring, fence);
        trace_radeon_fence_emit(rdev->ddev, fence->seq);
        fence->emitted = true;
        list_move_tail(&fence->list, &rdev->fence_drv[fence->ring].emitted);
@@ -191,9 +184,6 @@ bool radeon_fence_signaled(struct radeon_fence *fence)
        if (!fence)
                return true;
 
-       if (fence->rdev->gpu_lockup)
-               return true;
-
        write_lock_irqsave(&fence->rdev->fence_lock, irq_flags);
        signaled = fence->signaled;
        /* if we are shuting down report all fence as signaled */
@@ -260,18 +250,16 @@ retry:
                 */
                if (seq == rdev->fence_drv[fence->ring].last_seq &&
                    radeon_ring_is_lockup(rdev, fence->ring, &rdev->ring[fence->ring])) {
+
                        /* good news we believe it's a lockup */
                        printk(KERN_WARNING "GPU lockup (waiting for 0x%08X last fence id 0x%08X)\n",
                             fence->seq, seq);
-                       /* FIXME: what should we do ? marking everyone
-                        * as signaled for now
-                        */
-                       rdev->gpu_lockup = true;
+
+                       /* mark the ring as not ready any more */
+                       rdev->ring[fence->ring].ready = false;
                        r = radeon_gpu_reset(rdev);
                        if (r)
                                return r;
-                       radeon_fence_write(rdev, fence->seq, fence->ring);
-                       rdev->gpu_lockup = false;
                }
                timeout = RADEON_FENCE_JIFFIES_TIMEOUT;
                write_lock_irqsave(&rdev->fence_lock, irq_flags);
@@ -289,10 +277,11 @@ int radeon_fence_wait_next(struct radeon_device *rdev, int ring)
        struct radeon_fence *fence;
        int r;
 
-       if (rdev->gpu_lockup) {
-               return 0;
-       }
        write_lock_irqsave(&rdev->fence_lock, irq_flags);
+       if (!rdev->ring[ring].ready) {
+               write_unlock_irqrestore(&rdev->fence_lock, irq_flags);
+               return -EBUSY;
+       }
        if (list_empty(&rdev->fence_drv[ring].emitted)) {
                write_unlock_irqrestore(&rdev->fence_lock, irq_flags);
                return 0;
@@ -312,10 +301,11 @@ int radeon_fence_wait_last(struct radeon_device *rdev, int ring)
        struct radeon_fence *fence;
        int r;
 
-       if (rdev->gpu_lockup) {
-               return 0;
-       }
        write_lock_irqsave(&rdev->fence_lock, irq_flags);
+       if (!rdev->ring[ring].ready) {
+               write_unlock_irqrestore(&rdev->fence_lock, irq_flags);
+               return -EBUSY;
+       }
        if (list_empty(&rdev->fence_drv[ring].emitted)) {
                write_unlock_irqrestore(&rdev->fence_lock, irq_flags);
                return 0;
index 10706c6..7fb3b1f 100644 (file)
@@ -396,7 +396,6 @@ int rs600_asic_reset(struct radeon_device *rdev)
        /* Check if GPU is idle */
        if (G_000E40_GA_BUSY(status) || G_000E40_VAP_BUSY(status)) {
                dev_err(rdev->dev, "failed to reset GPU\n");
-               rdev->gpu_lockup = true;
                ret = -1;
        } else
                dev_info(rdev->dev, "GPU reset succeed\n");