aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/intel_overlay.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/i915/intel_overlay.c')
-rw-r--r--drivers/gpu/drm/i915/intel_overlay.c44
1 files changed, 32 insertions, 12 deletions
diff --git a/drivers/gpu/drm/i915/intel_overlay.c b/drivers/gpu/drm/i915/intel_overlay.c
index dc2f4f26c961..973c9de3b87d 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,19 @@ 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);
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_request(overlay->last_flip_req);
226 if (ret) 228 if (ret)
227 return ret; 229 return ret;
228 i915_gem_retire_requests(dev); 230 i915_gem_retire_requests(dev);
229 231
230 overlay->last_flip_req = 0; 232 i915_gem_request_assign(&overlay->last_flip_req, NULL);
231 return 0; 233 return 0;
232} 234}
233 235
@@ -286,7 +288,10 @@ static int intel_overlay_continue(struct intel_overlay *overlay,
286 intel_ring_emit(ring, flip_addr); 288 intel_ring_emit(ring, flip_addr);
287 intel_ring_advance(ring); 289 intel_ring_advance(ring);
288 290
289 return i915_add_request(ring, &overlay->last_flip_req); 291 WARN_ON(overlay->last_flip_req);
292 i915_gem_request_assign(&overlay->last_flip_req,
293 ring->outstanding_lazy_request);
294 return i915_add_request(ring);
290} 295}
291 296
292static void intel_overlay_release_old_vid_tail(struct intel_overlay *overlay) 297static void intel_overlay_release_old_vid_tail(struct intel_overlay *overlay)
@@ -361,23 +366,20 @@ static int intel_overlay_off(struct intel_overlay *overlay)
361 * We have to be careful not to repeat work forever an make forward progess. */ 366 * We have to be careful not to repeat work forever an make forward progess. */
362static int intel_overlay_recover_from_interrupt(struct intel_overlay *overlay) 367static int intel_overlay_recover_from_interrupt(struct intel_overlay *overlay)
363{ 368{
364 struct drm_device *dev = overlay->dev;
365 struct drm_i915_private *dev_priv = dev->dev_private;
366 struct intel_engine_cs *ring = &dev_priv->ring[RCS];
367 int ret; 369 int ret;
368 370
369 if (overlay->last_flip_req == 0) 371 if (overlay->last_flip_req == NULL)
370 return 0; 372 return 0;
371 373
372 ret = i915_wait_seqno(ring, overlay->last_flip_req); 374 ret = i915_wait_request(overlay->last_flip_req);
373 if (ret) 375 if (ret)
374 return ret; 376 return ret;
375 i915_gem_retire_requests(dev); 377 i915_gem_retire_requests(overlay->dev);
376 378
377 if (overlay->flip_tail) 379 if (overlay->flip_tail)
378 overlay->flip_tail(overlay); 380 overlay->flip_tail(overlay);
379 381
380 overlay->last_flip_req = 0; 382 i915_gem_request_assign(&overlay->last_flip_req, NULL);
381 return 0; 383 return 0;
382} 384}
383 385
@@ -392,6 +394,8 @@ static int intel_overlay_release_old_vid(struct intel_overlay *overlay)
392 struct intel_engine_cs *ring = &dev_priv->ring[RCS]; 394 struct intel_engine_cs *ring = &dev_priv->ring[RCS];
393 int ret; 395 int ret;
394 396
397 WARN_ON(!mutex_is_locked(&dev->struct_mutex));
398
395 /* Only wait if there is actually an old frame to release to 399 /* Only wait if there is actually an old frame to release to
396 * guarantee forward progress. 400 * guarantee forward progress.
397 */ 401 */
@@ -422,6 +426,22 @@ static int intel_overlay_release_old_vid(struct intel_overlay *overlay)
422 return 0; 426 return 0;
423} 427}
424 428
429void intel_overlay_reset(struct drm_i915_private *dev_priv)
430{
431 struct intel_overlay *overlay = dev_priv->overlay;
432
433 if (!overlay)
434 return;
435
436 intel_overlay_release_old_vid(overlay);
437
438 overlay->last_flip_req = NULL;
439 overlay->old_xscale = 0;
440 overlay->old_yscale = 0;
441 overlay->crtc = NULL;
442 overlay->active = false;
443}
444
425struct put_image_params { 445struct put_image_params {
426 int format; 446 int format;
427 short dst_x; 447 short dst_x;