mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-11-30 00:06:46 +07:00
drm/radeon: replace gpu_lockup with ring->ready flag
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>
This commit is contained in:
parent
312c4a8cf2
commit
25a9e35218
@ -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");
|
||||
|
@ -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");
|
||||
|
@ -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;
|
||||
|
@ -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",
|
||||
|
@ -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 @@ int radeon_fence_wait(struct radeon_fence *fence, bool intr)
|
||||
*/
|
||||
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;
|
||||
|
@ -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");
|
||||
|
Loading…
Reference in New Issue
Block a user