Lines Matching refs:overlay
190 intel_overlay_map_regs(struct intel_overlay *overlay) in intel_overlay_map_regs() argument
192 struct drm_i915_private *dev_priv = overlay->dev->dev_private; in intel_overlay_map_regs()
195 if (OVERLAY_NEEDS_PHYSICAL(overlay->dev)) in intel_overlay_map_regs()
196 regs = (struct overlay_registers __iomem *)overlay->reg_bo->phys_handle->vaddr; in intel_overlay_map_regs()
199 i915_gem_obj_ggtt_offset(overlay->reg_bo)); in intel_overlay_map_regs()
204 static void intel_overlay_unmap_regs(struct intel_overlay *overlay, in intel_overlay_unmap_regs() argument
207 if (!OVERLAY_NEEDS_PHYSICAL(overlay->dev)) in intel_overlay_unmap_regs()
211 static int intel_overlay_do_wait_request(struct intel_overlay *overlay, in intel_overlay_do_wait_request() argument
214 struct drm_device *dev = overlay->dev; in intel_overlay_do_wait_request()
219 BUG_ON(overlay->last_flip_req); in intel_overlay_do_wait_request()
220 i915_gem_request_assign(&overlay->last_flip_req, in intel_overlay_do_wait_request()
226 overlay->flip_tail = tail; in intel_overlay_do_wait_request()
227 ret = i915_wait_request(overlay->last_flip_req); in intel_overlay_do_wait_request()
232 i915_gem_request_assign(&overlay->last_flip_req, NULL); in intel_overlay_do_wait_request()
237 static int intel_overlay_on(struct intel_overlay *overlay) in intel_overlay_on() argument
239 struct drm_device *dev = overlay->dev; in intel_overlay_on()
244 BUG_ON(overlay->active); in intel_overlay_on()
245 overlay->active = 1; in intel_overlay_on()
254 intel_ring_emit(ring, overlay->flip_addr | OFC_UPDATE); in intel_overlay_on()
259 return intel_overlay_do_wait_request(overlay, NULL); in intel_overlay_on()
263 static int intel_overlay_continue(struct intel_overlay *overlay, in intel_overlay_continue() argument
266 struct drm_device *dev = overlay->dev; in intel_overlay_continue()
269 u32 flip_addr = overlay->flip_addr; in intel_overlay_continue()
273 BUG_ON(!overlay->active); in intel_overlay_continue()
291 WARN_ON(overlay->last_flip_req); in intel_overlay_continue()
292 i915_gem_request_assign(&overlay->last_flip_req, in intel_overlay_continue()
297 static void intel_overlay_release_old_vid_tail(struct intel_overlay *overlay) in intel_overlay_release_old_vid_tail() argument
299 struct drm_i915_gem_object *obj = overlay->old_vid_bo; in intel_overlay_release_old_vid_tail()
304 overlay->old_vid_bo = NULL; in intel_overlay_release_old_vid_tail()
307 static void intel_overlay_off_tail(struct intel_overlay *overlay) in intel_overlay_off_tail() argument
309 struct drm_i915_gem_object *obj = overlay->vid_bo; in intel_overlay_off_tail()
312 BUG_ON(!overlay->vid_bo); in intel_overlay_off_tail()
316 overlay->vid_bo = NULL; in intel_overlay_off_tail()
318 overlay->crtc->overlay = NULL; in intel_overlay_off_tail()
319 overlay->crtc = NULL; in intel_overlay_off_tail()
320 overlay->active = 0; in intel_overlay_off_tail()
324 static int intel_overlay_off(struct intel_overlay *overlay) in intel_overlay_off() argument
326 struct drm_device *dev = overlay->dev; in intel_overlay_off()
329 u32 flip_addr = overlay->flip_addr; in intel_overlay_off()
332 BUG_ON(!overlay->active); in intel_overlay_off()
362 return intel_overlay_do_wait_request(overlay, intel_overlay_off_tail); in intel_overlay_off()
367 static int intel_overlay_recover_from_interrupt(struct intel_overlay *overlay) in intel_overlay_recover_from_interrupt() argument
371 if (overlay->last_flip_req == NULL) in intel_overlay_recover_from_interrupt()
374 ret = i915_wait_request(overlay->last_flip_req); in intel_overlay_recover_from_interrupt()
377 i915_gem_retire_requests(overlay->dev); in intel_overlay_recover_from_interrupt()
379 if (overlay->flip_tail) in intel_overlay_recover_from_interrupt()
380 overlay->flip_tail(overlay); in intel_overlay_recover_from_interrupt()
382 i915_gem_request_assign(&overlay->last_flip_req, NULL); in intel_overlay_recover_from_interrupt()
390 static int intel_overlay_release_old_vid(struct intel_overlay *overlay) in intel_overlay_release_old_vid() argument
392 struct drm_device *dev = overlay->dev; in intel_overlay_release_old_vid()
402 if (!overlay->old_vid_bo) in intel_overlay_release_old_vid()
415 ret = intel_overlay_do_wait_request(overlay, in intel_overlay_release_old_vid()
421 intel_overlay_release_old_vid_tail(overlay); in intel_overlay_release_old_vid()
424 i915_gem_track_fb(overlay->old_vid_bo, NULL, in intel_overlay_release_old_vid()
425 INTEL_FRONTBUFFER_OVERLAY(overlay->crtc->pipe)); in intel_overlay_release_old_vid()
431 struct intel_overlay *overlay = dev_priv->overlay; in intel_overlay_reset() local
433 if (!overlay) in intel_overlay_reset()
436 intel_overlay_release_old_vid(overlay); in intel_overlay_reset()
438 overlay->last_flip_req = NULL; in intel_overlay_reset()
439 overlay->old_xscale = 0; in intel_overlay_reset()
440 overlay->old_yscale = 0; in intel_overlay_reset()
441 overlay->crtc = NULL; in intel_overlay_reset()
442 overlay->active = false; in intel_overlay_reset()
568 static bool update_scaling_factors(struct intel_overlay *overlay, in update_scaling_factors() argument
603 if (xscale != overlay->old_xscale || yscale != overlay->old_yscale) in update_scaling_factors()
605 overlay->old_xscale = xscale; in update_scaling_factors()
606 overlay->old_yscale = yscale; in update_scaling_factors()
628 static void update_colorkey(struct intel_overlay *overlay, in update_colorkey() argument
631 u32 key = overlay->color_key; in update_colorkey()
633 switch (overlay->crtc->base.primary->fb->bits_per_pixel) { in update_colorkey()
640 if (overlay->crtc->base.primary->fb->depth == 15) { in update_colorkey()
704 static int intel_overlay_do_put_image(struct intel_overlay *overlay, in intel_overlay_do_put_image() argument
711 struct drm_device *dev = overlay->dev; in intel_overlay_do_put_image()
713 enum pipe pipe = overlay->crtc->pipe; in intel_overlay_do_put_image()
717 BUG_ON(!overlay); in intel_overlay_do_put_image()
719 ret = intel_overlay_release_old_vid(overlay); in intel_overlay_do_put_image()
732 if (!overlay->active) { in intel_overlay_do_put_image()
734 regs = intel_overlay_map_regs(overlay); in intel_overlay_do_put_image()
740 if (IS_GEN4(overlay->dev)) in intel_overlay_do_put_image()
745 intel_overlay_unmap_regs(overlay, regs); in intel_overlay_do_put_image()
747 ret = intel_overlay_on(overlay); in intel_overlay_do_put_image()
752 regs = intel_overlay_map_regs(overlay); in intel_overlay_do_put_image()
767 swidthsw = calc_swidthsw(overlay->dev, params->offset_Y, tmp_width); in intel_overlay_do_put_image()
777 tmp_U = calc_swidthsw(overlay->dev, params->offset_U, in intel_overlay_do_put_image()
779 tmp_V = calc_swidthsw(overlay->dev, params->offset_V, in intel_overlay_do_put_image()
793 scale_changed = update_scaling_factors(overlay, regs, params); in intel_overlay_do_put_image()
795 update_colorkey(overlay, regs); in intel_overlay_do_put_image()
799 intel_overlay_unmap_regs(overlay, regs); in intel_overlay_do_put_image()
801 ret = intel_overlay_continue(overlay, scale_changed); in intel_overlay_do_put_image()
805 i915_gem_track_fb(overlay->vid_bo, new_bo, in intel_overlay_do_put_image()
808 overlay->old_vid_bo = overlay->vid_bo; in intel_overlay_do_put_image()
809 overlay->vid_bo = new_bo; in intel_overlay_do_put_image()
821 int intel_overlay_switch_off(struct intel_overlay *overlay) in intel_overlay_switch_off() argument
824 struct drm_device *dev = overlay->dev; in intel_overlay_switch_off()
830 ret = intel_overlay_recover_from_interrupt(overlay); in intel_overlay_switch_off()
834 if (!overlay->active) in intel_overlay_switch_off()
837 ret = intel_overlay_release_old_vid(overlay); in intel_overlay_switch_off()
841 regs = intel_overlay_map_regs(overlay); in intel_overlay_switch_off()
843 intel_overlay_unmap_regs(overlay, regs); in intel_overlay_switch_off()
845 ret = intel_overlay_off(overlay); in intel_overlay_switch_off()
849 intel_overlay_off_tail(overlay); in intel_overlay_switch_off()
853 static int check_overlay_possible_on_crtc(struct intel_overlay *overlay, in check_overlay_possible_on_crtc() argument
866 static void update_pfit_vscale_ratio(struct intel_overlay *overlay) in update_pfit_vscale_ratio() argument
868 struct drm_device *dev = overlay->dev; in update_pfit_vscale_ratio()
887 overlay->pfit_vscale_ratio = ratio; in update_pfit_vscale_ratio()
890 static int check_overlay_dst(struct intel_overlay *overlay, in check_overlay_dst() argument
893 struct drm_display_mode *mode = &overlay->crtc->base.mode; in check_overlay_dst()
1062 struct intel_overlay *overlay; in intel_overlay_put_image() local
1069 overlay = dev_priv->overlay; in intel_overlay_put_image()
1070 if (!overlay) { in intel_overlay_put_image()
1079 ret = intel_overlay_switch_off(overlay); in intel_overlay_put_image()
1114 ret = intel_overlay_recover_from_interrupt(overlay); in intel_overlay_put_image()
1118 if (overlay->crtc != crtc) { in intel_overlay_put_image()
1120 ret = intel_overlay_switch_off(overlay); in intel_overlay_put_image()
1124 ret = check_overlay_possible_on_crtc(overlay, crtc); in intel_overlay_put_image()
1128 overlay->crtc = crtc; in intel_overlay_put_image()
1129 crtc->overlay = overlay; in intel_overlay_put_image()
1134 overlay->pfit_active = 1; in intel_overlay_put_image()
1135 update_pfit_vscale_ratio(overlay); in intel_overlay_put_image()
1137 overlay->pfit_active = 0; in intel_overlay_put_image()
1140 ret = check_overlay_dst(overlay, put_image_rec); in intel_overlay_put_image()
1144 if (overlay->pfit_active) { in intel_overlay_put_image()
1146 overlay->pfit_vscale_ratio); in intel_overlay_put_image()
1149 overlay->pfit_vscale_ratio) + 1; in intel_overlay_put_image()
1182 ret = intel_overlay_do_put_image(overlay, new_bo, params); in intel_overlay_put_image()
1203 static void update_reg_attrs(struct intel_overlay *overlay, in update_reg_attrs() argument
1206 iowrite32((overlay->contrast << 18) | (overlay->brightness & 0xff), in update_reg_attrs()
1208 iowrite32(overlay->saturation, ®s->OCLRC1); in update_reg_attrs()
1260 struct intel_overlay *overlay; in intel_overlay_attrs() local
1264 overlay = dev_priv->overlay; in intel_overlay_attrs()
1265 if (!overlay) { in intel_overlay_attrs()
1275 attrs->color_key = overlay->color_key; in intel_overlay_attrs()
1276 attrs->brightness = overlay->brightness; in intel_overlay_attrs()
1277 attrs->contrast = overlay->contrast; in intel_overlay_attrs()
1278 attrs->saturation = overlay->saturation; in intel_overlay_attrs()
1296 overlay->color_key = attrs->color_key; in intel_overlay_attrs()
1297 overlay->brightness = attrs->brightness; in intel_overlay_attrs()
1298 overlay->contrast = attrs->contrast; in intel_overlay_attrs()
1299 overlay->saturation = attrs->saturation; in intel_overlay_attrs()
1301 regs = intel_overlay_map_regs(overlay); in intel_overlay_attrs()
1307 update_reg_attrs(overlay, regs); in intel_overlay_attrs()
1309 intel_overlay_unmap_regs(overlay, regs); in intel_overlay_attrs()
1315 if (overlay->active) { in intel_overlay_attrs()
1344 struct intel_overlay *overlay; in intel_setup_overlay() local
1352 overlay = kzalloc(sizeof(*overlay), GFP_KERNEL); in intel_setup_overlay()
1353 if (!overlay) in intel_setup_overlay()
1357 if (WARN_ON(dev_priv->overlay)) in intel_setup_overlay()
1360 overlay->dev = dev; in intel_setup_overlay()
1369 overlay->reg_bo = reg_bo; in intel_setup_overlay()
1377 overlay->flip_addr = reg_bo->phys_handle->busaddr; in intel_setup_overlay()
1384 overlay->flip_addr = i915_gem_obj_ggtt_offset(reg_bo); in intel_setup_overlay()
1394 overlay->color_key = 0x0101fe; in intel_setup_overlay()
1395 overlay->brightness = -19; in intel_setup_overlay()
1396 overlay->contrast = 75; in intel_setup_overlay()
1397 overlay->saturation = 146; in intel_setup_overlay()
1399 regs = intel_overlay_map_regs(overlay); in intel_setup_overlay()
1405 update_reg_attrs(overlay, regs); in intel_setup_overlay()
1407 intel_overlay_unmap_regs(overlay, regs); in intel_setup_overlay()
1409 dev_priv->overlay = overlay; in intel_setup_overlay()
1421 kfree(overlay); in intel_setup_overlay()
1429 if (!dev_priv->overlay) in intel_cleanup_overlay()
1435 BUG_ON(dev_priv->overlay->active); in intel_cleanup_overlay()
1437 drm_gem_object_unreference_unlocked(&dev_priv->overlay->reg_bo->base); in intel_cleanup_overlay()
1438 kfree(dev_priv->overlay); in intel_cleanup_overlay()
1449 intel_overlay_map_regs_atomic(struct intel_overlay *overlay) in intel_overlay_map_regs_atomic() argument
1451 struct drm_i915_private *dev_priv = overlay->dev->dev_private; in intel_overlay_map_regs_atomic()
1454 if (OVERLAY_NEEDS_PHYSICAL(overlay->dev)) in intel_overlay_map_regs_atomic()
1458 overlay->reg_bo->phys_handle->vaddr; in intel_overlay_map_regs_atomic()
1461 i915_gem_obj_ggtt_offset(overlay->reg_bo)); in intel_overlay_map_regs_atomic()
1466 static void intel_overlay_unmap_regs_atomic(struct intel_overlay *overlay, in intel_overlay_unmap_regs_atomic() argument
1469 if (!OVERLAY_NEEDS_PHYSICAL(overlay->dev)) in intel_overlay_unmap_regs_atomic()
1478 struct intel_overlay *overlay = dev_priv->overlay; in intel_overlay_capture_error_state() local
1482 if (!overlay || !overlay->active) in intel_overlay_capture_error_state()
1491 if (OVERLAY_NEEDS_PHYSICAL(overlay->dev)) in intel_overlay_capture_error_state()
1492 error->base = (__force long)overlay->reg_bo->phys_handle->vaddr; in intel_overlay_capture_error_state()
1494 error->base = i915_gem_obj_ggtt_offset(overlay->reg_bo); in intel_overlay_capture_error_state()
1496 regs = intel_overlay_map_regs_atomic(overlay); in intel_overlay_capture_error_state()
1501 intel_overlay_unmap_regs_atomic(overlay, regs); in intel_overlay_capture_error_state()