diff options
Diffstat (limited to 'drivers/gpu/drm/i915/intel_overlay.c')
-rw-r--r-- | drivers/gpu/drm/i915/intel_overlay.c | 41 |
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 | ||
214 | static int intel_overlay_do_wait_request(struct intel_overlay *overlay, | 214 | static 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); |
326 | out: | 323 | out: |
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 */ |
404 | static int intel_overlay_off(struct intel_overlay *overlay, | 401 | static 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. */ |
446 | static int intel_overlay_recover_from_interrupt(struct intel_overlay *overlay, | 442 | static 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 | ||
871 | int intel_overlay_switch_off(struct intel_overlay *overlay, | 865 | int 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 | ||