It makes no sense at all to have more than one flag.

Signed-off-by: Christian König <deathsim...@vodafone.de>
Reviewed-by: Alex Deucher <alexander.deuc...@amd.com>
Reviewed-by: Jerome Glisse <jgli...@redhat.com>
---
 drivers/gpu/drm/radeon/r100.c          |    1 -
 drivers/gpu/drm/radeon/r300.c          |    1 -
 drivers/gpu/drm/radeon/radeon.h        |    1 -
 drivers/gpu/drm/radeon/radeon_device.c |    1 -
 drivers/gpu/drm/radeon/radeon_fence.c  |   36 +++++++++++--------------------
 drivers/gpu/drm/radeon/rs600.c         |    1 -
 6 files changed, 13 insertions(+), 28 deletions(-)

diff --git a/drivers/gpu/drm/radeon/r100.c b/drivers/gpu/drm/radeon/r100.c
index cb11418..a0b44a5 100644
--- a/drivers/gpu/drm/radeon/r100.c
+++ b/drivers/gpu/drm/radeon/r100.c
@@ -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");
diff --git a/drivers/gpu/drm/radeon/r300.c b/drivers/gpu/drm/radeon/r300.c
index fa14383..a63f432 100644
--- a/drivers/gpu/drm/radeon/r300.c
+++ b/drivers/gpu/drm/radeon/r300.c
@@ -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");
diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
index 4026a4c0..c76724b 100644
--- a/drivers/gpu/drm/radeon/radeon.h
+++ b/drivers/gpu/drm/radeon/radeon.h
@@ -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;
diff --git a/drivers/gpu/drm/radeon/radeon_device.c 
b/drivers/gpu/drm/radeon/radeon_device.c
index 0fb4f89..dedb398 100644
--- a/drivers/gpu/drm/radeon/radeon_device.c
+++ b/drivers/gpu/drm/radeon/radeon_device.c
@@ -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",
diff --git a/drivers/gpu/drm/radeon/radeon_fence.c 
b/drivers/gpu/drm/radeon/radeon_fence.c
index 66b2229..36c411f 100644
--- a/drivers/gpu/drm/radeon/radeon_fence.c
+++ b/drivers/gpu/drm/radeon/radeon_fence.c
@@ -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;
diff --git a/drivers/gpu/drm/radeon/rs600.c b/drivers/gpu/drm/radeon/rs600.c
index 10706c6..7fb3b1f 100644
--- a/drivers/gpu/drm/radeon/rs600.c
+++ b/drivers/gpu/drm/radeon/rs600.c
@@ -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");
-- 
1.7.5.4

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel

Reply via email to