diff options
| author | Linux Build Service Account <lnxbuild@quicinc.com> | 2017-07-05 18:20:20 -0700 |
|---|---|---|
| committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2017-07-05 18:20:20 -0700 |
| commit | f96a299e772d27f4845b5da4bfdf0bb46570d9df (patch) | |
| tree | 1ca4b0375fe9d2aac4d760010df7f237de9362df /drivers/gpu/drm/msm/msm_gpu.c | |
| parent | e28c151ad1032937ed766355577c5e1d760bdf4c (diff) | |
| parent | 5c91d8529cc0dd1e8e5ead0aeaa374e7735992f8 (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.c | 25 |
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); |
