aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/intel_overlay.c
diff options
context:
space:
mode:
authorJohn Harrison <John.C.Harrison@Intel.com>2014-11-24 13:49:31 -0500
committerDaniel Vetter <daniel.vetter@ffwll.ch>2014-12-03 03:35:17 -0500
commit9bfc01a29b7d4d6b965a596b047b405bf6f58be1 (patch)
treec7107dcba1f6c3c8f610edd47340fc5a3ed00c76 /drivers/gpu/drm/i915/intel_overlay.c
parentb6660d59f66835e4e99eaa772ea4cb74f96f4de3 (diff)
drm/i915: Convert 'last_flip_req' to be a request not a seqno
Converted 'last_flip_req' to be an actual request rather than a seqno value as part of the on going seqno to request changes. This includes reference counting the request being saved away to ensure it can not be retired and freed while the overlay code is still waiting on it. For: VIZ-4377 Signed-off-by: John Harrison <John.C.Harrison@Intel.com> Reviewed-by: Thomas Daniel <Thomas.Daniel@intel.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers/gpu/drm/i915/intel_overlay.c')
-rw-r--r--drivers/gpu/drm/i915/intel_overlay.c23
1 files changed, 15 insertions, 8 deletions
diff --git a/drivers/gpu/drm/i915/intel_overlay.c b/drivers/gpu/drm/i915/intel_overlay.c
index dc2f4f26c961..5defc37d8adb 100644
--- a/drivers/gpu/drm/i915/intel_overlay.c
+++ b/drivers/gpu/drm/i915/intel_overlay.c
@@ -182,7 +182,7 @@ struct intel_overlay {
182 u32 flip_addr; 182 u32 flip_addr;
183 struct drm_i915_gem_object *reg_bo; 183 struct drm_i915_gem_object *reg_bo;
184 /* flip handling */ 184 /* flip handling */
185 uint32_t last_flip_req; 185 struct drm_i915_gem_request *last_flip_req;
186 void (*flip_tail)(struct intel_overlay *); 186 void (*flip_tail)(struct intel_overlay *);
187}; 187};
188 188
@@ -217,17 +217,20 @@ static int intel_overlay_do_wait_request(struct intel_overlay *overlay,
217 int ret; 217 int ret;
218 218
219 BUG_ON(overlay->last_flip_req); 219 BUG_ON(overlay->last_flip_req);
220 ret = i915_add_request(ring, &overlay->last_flip_req); 220 i915_gem_request_assign(&overlay->last_flip_req,
221 ring->outstanding_lazy_request);
222 ret = i915_add_request(ring, NULL);
221 if (ret) 223 if (ret)
222 return ret; 224 return ret;
223 225
224 overlay->flip_tail = tail; 226 overlay->flip_tail = tail;
225 ret = i915_wait_seqno(ring, overlay->last_flip_req); 227 ret = i915_wait_seqno(ring,
228 i915_gem_request_get_seqno(overlay->last_flip_req));
226 if (ret) 229 if (ret)
227 return ret; 230 return ret;
228 i915_gem_retire_requests(dev); 231 i915_gem_retire_requests(dev);
229 232
230 overlay->last_flip_req = 0; 233 i915_gem_request_assign(&overlay->last_flip_req, NULL);
231 return 0; 234 return 0;
232} 235}
233 236
@@ -286,7 +289,10 @@ static int intel_overlay_continue(struct intel_overlay *overlay,
286 intel_ring_emit(ring, flip_addr); 289 intel_ring_emit(ring, flip_addr);
287 intel_ring_advance(ring); 290 intel_ring_advance(ring);
288 291
289 return i915_add_request(ring, &overlay->last_flip_req); 292 WARN_ON(overlay->last_flip_req);
293 i915_gem_request_assign(&overlay->last_flip_req,
294 ring->outstanding_lazy_request);
295 return i915_add_request(ring, NULL);
290} 296}
291 297
292static void intel_overlay_release_old_vid_tail(struct intel_overlay *overlay) 298static void intel_overlay_release_old_vid_tail(struct intel_overlay *overlay)
@@ -366,10 +372,11 @@ static int intel_overlay_recover_from_interrupt(struct intel_overlay *overlay)
366 struct intel_engine_cs *ring = &dev_priv->ring[RCS]; 372 struct intel_engine_cs *ring = &dev_priv->ring[RCS];
367 int ret; 373 int ret;
368 374
369 if (overlay->last_flip_req == 0) 375 if (overlay->last_flip_req == NULL)
370 return 0; 376 return 0;
371 377
372 ret = i915_wait_seqno(ring, overlay->last_flip_req); 378 ret = i915_wait_seqno(ring,
379 i915_gem_request_get_seqno(overlay->last_flip_req));
373 if (ret) 380 if (ret)
374 return ret; 381 return ret;
375 i915_gem_retire_requests(dev); 382 i915_gem_retire_requests(dev);
@@ -377,7 +384,7 @@ static int intel_overlay_recover_from_interrupt(struct intel_overlay *overlay)
377 if (overlay->flip_tail) 384 if (overlay->flip_tail)
378 overlay->flip_tail(overlay); 385 overlay->flip_tail(overlay);
379 386
380 overlay->last_flip_req = 0; 387 i915_gem_request_assign(&overlay->last_flip_req, NULL);
381 return 0; 388 return 0;
382} 389}
383 390