diff options
Diffstat (limited to 'drivers/gpu/drm/i915/intel_overlay.c')
-rw-r--r-- | drivers/gpu/drm/i915/intel_overlay.c | 44 |
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 | ||
292 | static void intel_overlay_release_old_vid_tail(struct intel_overlay *overlay) | 297 | static 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. */ |
362 | static int intel_overlay_recover_from_interrupt(struct intel_overlay *overlay) | 367 | static 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 | ||
429 | void 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 | |||
425 | struct put_image_params { | 445 | struct put_image_params { |
426 | int format; | 446 | int format; |
427 | short dst_x; | 447 | short dst_x; |