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.c41
1 files changed, 17 insertions, 24 deletions
diff --git a/drivers/gpu/drm/i915/intel_overlay.c b/drivers/gpu/drm/i915/intel_overlay.c
index 3fbb98b948d..a670c006982 100644
--- a/drivers/gpu/drm/i915/intel_overlay.c
+++ b/drivers/gpu/drm/i915/intel_overlay.c
@@ -213,7 +213,6 @@ static void intel_overlay_unmap_regs(struct intel_overlay *overlay,
213 213
214static int intel_overlay_do_wait_request(struct intel_overlay *overlay, 214static int intel_overlay_do_wait_request(struct intel_overlay *overlay,
215 struct drm_i915_gem_request *request, 215 struct drm_i915_gem_request *request,
216 bool interruptible,
217 void (*tail)(struct intel_overlay *)) 216 void (*tail)(struct intel_overlay *))
218{ 217{
219 struct drm_device *dev = overlay->dev; 218 struct drm_device *dev = overlay->dev;
@@ -221,16 +220,14 @@ static int intel_overlay_do_wait_request(struct intel_overlay *overlay,
221 int ret; 220 int ret;
222 221
223 BUG_ON(overlay->last_flip_req); 222 BUG_ON(overlay->last_flip_req);
224 ret = i915_add_request(dev, NULL, request, LP_RING(dev_priv)); 223 ret = i915_add_request(LP_RING(dev_priv), NULL, request);
225 if (ret) { 224 if (ret) {
226 kfree(request); 225 kfree(request);
227 return ret; 226 return ret;
228 } 227 }
229 overlay->last_flip_req = request->seqno; 228 overlay->last_flip_req = request->seqno;
230 overlay->flip_tail = tail; 229 overlay->flip_tail = tail;
231 ret = i915_do_wait_request(dev, 230 ret = i915_wait_request(LP_RING(dev_priv), overlay->last_flip_req);
232 overlay->last_flip_req, true,
233 LP_RING(dev_priv));
234 if (ret) 231 if (ret)
235 return ret; 232 return ret;
236 233
@@ -256,7 +253,7 @@ i830_activate_pipe_a(struct drm_device *dev)
256 return 0; 253 return 0;
257 254
258 /* most i8xx have pipe a forced on, so don't trust dpms mode */ 255 /* most i8xx have pipe a forced on, so don't trust dpms mode */
259 if (I915_READ(PIPEACONF) & PIPECONF_ENABLE) 256 if (I915_READ(_PIPEACONF) & PIPECONF_ENABLE)
260 return 0; 257 return 0;
261 258
262 crtc_funcs = crtc->base.helper_private; 259 crtc_funcs = crtc->base.helper_private;
@@ -322,7 +319,7 @@ static int intel_overlay_on(struct intel_overlay *overlay)
322 OUT_RING(MI_NOOP); 319 OUT_RING(MI_NOOP);
323 ADVANCE_LP_RING(); 320 ADVANCE_LP_RING();
324 321
325 ret = intel_overlay_do_wait_request(overlay, request, true, NULL); 322 ret = intel_overlay_do_wait_request(overlay, request, NULL);
326out: 323out:
327 if (pipe_a_quirk) 324 if (pipe_a_quirk)
328 i830_deactivate_pipe_a(dev); 325 i830_deactivate_pipe_a(dev);
@@ -364,7 +361,7 @@ static int intel_overlay_continue(struct intel_overlay *overlay,
364 OUT_RING(flip_addr); 361 OUT_RING(flip_addr);
365 ADVANCE_LP_RING(); 362 ADVANCE_LP_RING();
366 363
367 ret = i915_add_request(dev, NULL, request, LP_RING(dev_priv)); 364 ret = i915_add_request(LP_RING(dev_priv), NULL, request);
368 if (ret) { 365 if (ret) {
369 kfree(request); 366 kfree(request);
370 return ret; 367 return ret;
@@ -401,8 +398,7 @@ static void intel_overlay_off_tail(struct intel_overlay *overlay)
401} 398}
402 399
403/* overlay needs to be disabled in OCMD reg */ 400/* overlay needs to be disabled in OCMD reg */
404static int intel_overlay_off(struct intel_overlay *overlay, 401static int intel_overlay_off(struct intel_overlay *overlay)
405 bool interruptible)
406{ 402{
407 struct drm_device *dev = overlay->dev; 403 struct drm_device *dev = overlay->dev;
408 struct drm_i915_private *dev_priv = dev->dev_private; 404 struct drm_i915_private *dev_priv = dev->dev_private;
@@ -437,14 +433,13 @@ static int intel_overlay_off(struct intel_overlay *overlay,
437 OUT_RING(MI_WAIT_FOR_EVENT | MI_WAIT_FOR_OVERLAY_FLIP); 433 OUT_RING(MI_WAIT_FOR_EVENT | MI_WAIT_FOR_OVERLAY_FLIP);
438 ADVANCE_LP_RING(); 434 ADVANCE_LP_RING();
439 435
440 return intel_overlay_do_wait_request(overlay, request, interruptible, 436 return intel_overlay_do_wait_request(overlay, request,
441 intel_overlay_off_tail); 437 intel_overlay_off_tail);
442} 438}
443 439
444/* recover from an interruption due to a signal 440/* recover from an interruption due to a signal
445 * We have to be careful not to repeat work forever an make forward progess. */ 441 * We have to be careful not to repeat work forever an make forward progess. */
446static int intel_overlay_recover_from_interrupt(struct intel_overlay *overlay, 442static int intel_overlay_recover_from_interrupt(struct intel_overlay *overlay)
447 bool interruptible)
448{ 443{
449 struct drm_device *dev = overlay->dev; 444 struct drm_device *dev = overlay->dev;
450 drm_i915_private_t *dev_priv = dev->dev_private; 445 drm_i915_private_t *dev_priv = dev->dev_private;
@@ -453,8 +448,7 @@ static int intel_overlay_recover_from_interrupt(struct intel_overlay *overlay,
453 if (overlay->last_flip_req == 0) 448 if (overlay->last_flip_req == 0)
454 return 0; 449 return 0;
455 450
456 ret = i915_do_wait_request(dev, overlay->last_flip_req, 451 ret = i915_wait_request(LP_RING(dev_priv), overlay->last_flip_req);
457 interruptible, LP_RING(dev_priv));
458 if (ret) 452 if (ret)
459 return ret; 453 return ret;
460 454
@@ -499,7 +493,7 @@ static int intel_overlay_release_old_vid(struct intel_overlay *overlay)
499 OUT_RING(MI_NOOP); 493 OUT_RING(MI_NOOP);
500 ADVANCE_LP_RING(); 494 ADVANCE_LP_RING();
501 495
502 ret = intel_overlay_do_wait_request(overlay, request, true, 496 ret = intel_overlay_do_wait_request(overlay, request,
503 intel_overlay_release_old_vid_tail); 497 intel_overlay_release_old_vid_tail);
504 if (ret) 498 if (ret)
505 return ret; 499 return ret;
@@ -868,8 +862,7 @@ out_unpin:
868 return ret; 862 return ret;
869} 863}
870 864
871int intel_overlay_switch_off(struct intel_overlay *overlay, 865int intel_overlay_switch_off(struct intel_overlay *overlay)
872 bool interruptible)
873{ 866{
874 struct overlay_registers *regs; 867 struct overlay_registers *regs;
875 struct drm_device *dev = overlay->dev; 868 struct drm_device *dev = overlay->dev;
@@ -878,7 +871,7 @@ int intel_overlay_switch_off(struct intel_overlay *overlay,
878 BUG_ON(!mutex_is_locked(&dev->struct_mutex)); 871 BUG_ON(!mutex_is_locked(&dev->struct_mutex));
879 BUG_ON(!mutex_is_locked(&dev->mode_config.mutex)); 872 BUG_ON(!mutex_is_locked(&dev->mode_config.mutex));
880 873
881 ret = intel_overlay_recover_from_interrupt(overlay, interruptible); 874 ret = intel_overlay_recover_from_interrupt(overlay);
882 if (ret != 0) 875 if (ret != 0)
883 return ret; 876 return ret;
884 877
@@ -893,7 +886,7 @@ int intel_overlay_switch_off(struct intel_overlay *overlay,
893 regs->OCMD = 0; 886 regs->OCMD = 0;
894 intel_overlay_unmap_regs(overlay, regs); 887 intel_overlay_unmap_regs(overlay, regs);
895 888
896 ret = intel_overlay_off(overlay, interruptible); 889 ret = intel_overlay_off(overlay);
897 if (ret != 0) 890 if (ret != 0)
898 return ret; 891 return ret;
899 892
@@ -1135,7 +1128,7 @@ int intel_overlay_put_image(struct drm_device *dev, void *data,
1135 mutex_lock(&dev->mode_config.mutex); 1128 mutex_lock(&dev->mode_config.mutex);
1136 mutex_lock(&dev->struct_mutex); 1129 mutex_lock(&dev->struct_mutex);
1137 1130
1138 ret = intel_overlay_switch_off(overlay, true); 1131 ret = intel_overlay_switch_off(overlay);
1139 1132
1140 mutex_unlock(&dev->struct_mutex); 1133 mutex_unlock(&dev->struct_mutex);
1141 mutex_unlock(&dev->mode_config.mutex); 1134 mutex_unlock(&dev->mode_config.mutex);
@@ -1157,7 +1150,7 @@ int intel_overlay_put_image(struct drm_device *dev, void *data,
1157 1150
1158 new_bo = to_intel_bo(drm_gem_object_lookup(dev, file_priv, 1151 new_bo = to_intel_bo(drm_gem_object_lookup(dev, file_priv,
1159 put_image_rec->bo_handle)); 1152 put_image_rec->bo_handle));
1160 if (!new_bo) { 1153 if (&new_bo->base == NULL) {
1161 ret = -ENOENT; 1154 ret = -ENOENT;
1162 goto out_free; 1155 goto out_free;
1163 } 1156 }
@@ -1171,13 +1164,13 @@ int intel_overlay_put_image(struct drm_device *dev, void *data,
1171 goto out_unlock; 1164 goto out_unlock;
1172 } 1165 }
1173 1166
1174 ret = intel_overlay_recover_from_interrupt(overlay, true); 1167 ret = intel_overlay_recover_from_interrupt(overlay);
1175 if (ret != 0) 1168 if (ret != 0)
1176 goto out_unlock; 1169 goto out_unlock;
1177 1170
1178 if (overlay->crtc != crtc) { 1171 if (overlay->crtc != crtc) {
1179 struct drm_display_mode *mode = &crtc->base.mode; 1172 struct drm_display_mode *mode = &crtc->base.mode;
1180 ret = intel_overlay_switch_off(overlay, true); 1173 ret = intel_overlay_switch_off(overlay);
1181 if (ret != 0) 1174 if (ret != 0)
1182 goto out_unlock; 1175 goto out_unlock;
1183 1176