summaryrefslogtreecommitdiff
path: root/drivers/gpu/drm/msm/msm_gpu.c
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@quicinc.com>2017-07-05 18:20:20 -0700
committerGerrit - the friendly Code Review server <code-review@localhost>2017-07-05 18:20:20 -0700
commitf96a299e772d27f4845b5da4bfdf0bb46570d9df (patch)
tree1ca4b0375fe9d2aac4d760010df7f237de9362df /drivers/gpu/drm/msm/msm_gpu.c
parente28c151ad1032937ed766355577c5e1d760bdf4c (diff)
parent5c91d8529cc0dd1e8e5ead0aeaa374e7735992f8 (diff)
Merge "drm/msm: Add timestamp counter"
Diffstat (limited to 'drivers/gpu/drm/msm/msm_gpu.c')
-rw-r--r--drivers/gpu/drm/msm/msm_gpu.c25
1 files changed, 10 insertions, 15 deletions
diff --git a/drivers/gpu/drm/msm/msm_gpu.c b/drivers/gpu/drm/msm/msm_gpu.c
index 6bac1cf6f7c5..8073898e4275 100644
--- a/drivers/gpu/drm/msm/msm_gpu.c
+++ b/drivers/gpu/drm/msm/msm_gpu.c
@@ -310,8 +310,7 @@ static void recover_worker(struct work_struct *work)
/* Retire all events that have already passed */
FOR_EACH_RING(gpu, ring, i)
- retire_submits(gpu, ring,
- gpu->funcs->last_fence(gpu, ring));
+ retire_submits(gpu, ring, ring->memptrs->fence);
retire_guilty_submit(gpu, gpu->funcs->active_ring(gpu));
@@ -319,7 +318,7 @@ static void recover_worker(struct work_struct *work)
gpu->funcs->recover(gpu);
/* Replay the remaining on all rings, highest priority first */
- for (i = gpu->nr_rings - 1; i >= 0; i--) {
+ for (i = 0; i < gpu->nr_rings; i++) {
struct msm_ringbuffer *ring = gpu->rb[i];
list_for_each_entry(submit, &ring->submits, node)
@@ -344,16 +343,16 @@ static void hangcheck_handler(unsigned long data)
struct drm_device *dev = gpu->dev;
struct msm_drm_private *priv = dev->dev_private;
struct msm_ringbuffer *ring = gpu->funcs->active_ring(gpu);
- uint32_t fence = gpu->funcs->last_fence(gpu, ring);
+ uint32_t fence = ring->memptrs->fence;
uint32_t submitted = gpu->funcs->submitted_fence(gpu, ring);
- if (fence != gpu->hangcheck_fence[ring->id]) {
+ if (fence != ring->hangcheck_fence) {
/* some progress has been made.. ya! */
- gpu->hangcheck_fence[ring->id] = fence;
+ ring->hangcheck_fence = fence;
} else if (fence < submitted) {
struct msm_gem_submit *submit;
- gpu->hangcheck_fence[ring->id] = fence;
+ ring->hangcheck_fence = fence;
/*
* No progress done, but see if the current submit is
@@ -379,7 +378,7 @@ static void hangcheck_handler(unsigned long data)
out:
/* if still more pending work, reset the hangcheck timer: */
- if (submitted > gpu->hangcheck_fence[ring->id])
+ if (submitted > ring->hangcheck_fence)
hangcheck_timer_reset(gpu);
/* workaround for missing irq: */
@@ -542,16 +541,13 @@ static void retire_worker(struct work_struct *work)
int i;
FOR_EACH_RING(gpu, ring, i) {
- uint32_t fence;
-
if (!ring)
continue;
- fence = gpu->funcs->last_fence(gpu, ring);
- msm_update_fence(gpu->dev, fence);
+ msm_update_fence(gpu->dev, ring->memptrs->fence);
mutex_lock(&dev->struct_mutex);
- _retire_ring(gpu, ring, fence);
+ _retire_ring(gpu, ring, ring->memptrs->fence);
mutex_unlock(&dev->struct_mutex);
}
@@ -571,13 +567,12 @@ void msm_gpu_retire(struct msm_gpu *gpu)
int msm_gpu_submit(struct msm_gpu *gpu, struct msm_gem_submit *submit)
{
struct drm_device *dev = gpu->dev;
- struct msm_drm_private *priv = dev->dev_private;
struct msm_ringbuffer *ring = gpu->rb[submit->ring];
int i;
WARN_ON(!mutex_is_locked(&dev->struct_mutex));
- submit->fence = FENCE(submit->ring, ++priv->next_fence[submit->ring]);
+ submit->fence = FENCE(submit->ring, ++ring->seqno);
inactive_cancel(gpu);