Lines Matching refs:overlay

191 intel_overlay_map_regs(struct intel_overlay *overlay)  in intel_overlay_map_regs()  argument
193 struct drm_i915_private *dev_priv = overlay->dev->dev_private; in intel_overlay_map_regs()
196 if (OVERLAY_NEEDS_PHYSICAL(overlay->dev)) in intel_overlay_map_regs()
197 regs = (struct overlay_registers __iomem *)overlay->reg_bo->phys_handle->vaddr; in intel_overlay_map_regs()
200 i915_gem_obj_ggtt_offset(overlay->reg_bo)); in intel_overlay_map_regs()
205 static void intel_overlay_unmap_regs(struct intel_overlay *overlay, in intel_overlay_unmap_regs() argument
208 if (!OVERLAY_NEEDS_PHYSICAL(overlay->dev)) in intel_overlay_unmap_regs()
212 static int intel_overlay_do_wait_request(struct intel_overlay *overlay, in intel_overlay_do_wait_request() argument
218 WARN_ON(overlay->last_flip_req); in intel_overlay_do_wait_request()
219 i915_gem_request_assign(&overlay->last_flip_req, req); in intel_overlay_do_wait_request()
222 overlay->flip_tail = tail; in intel_overlay_do_wait_request()
223 ret = i915_wait_request(overlay->last_flip_req); in intel_overlay_do_wait_request()
227 i915_gem_request_assign(&overlay->last_flip_req, NULL); in intel_overlay_do_wait_request()
232 static int intel_overlay_on(struct intel_overlay *overlay) in intel_overlay_on() argument
234 struct drm_device *dev = overlay->dev; in intel_overlay_on()
240 WARN_ON(overlay->active); in intel_overlay_on()
253 overlay->active = true; in intel_overlay_on()
256 intel_ring_emit(ring, overlay->flip_addr | OFC_UPDATE); in intel_overlay_on()
261 return intel_overlay_do_wait_request(overlay, req, NULL); in intel_overlay_on()
265 static int intel_overlay_continue(struct intel_overlay *overlay, in intel_overlay_continue() argument
268 struct drm_device *dev = overlay->dev; in intel_overlay_continue()
272 u32 flip_addr = overlay->flip_addr; in intel_overlay_continue()
276 WARN_ON(!overlay->active); in intel_overlay_continue()
300 WARN_ON(overlay->last_flip_req); in intel_overlay_continue()
301 i915_gem_request_assign(&overlay->last_flip_req, req); in intel_overlay_continue()
307 static void intel_overlay_release_old_vid_tail(struct intel_overlay *overlay) in intel_overlay_release_old_vid_tail() argument
309 struct drm_i915_gem_object *obj = overlay->old_vid_bo; in intel_overlay_release_old_vid_tail()
314 overlay->old_vid_bo = NULL; in intel_overlay_release_old_vid_tail()
317 static void intel_overlay_off_tail(struct intel_overlay *overlay) in intel_overlay_off_tail() argument
319 struct drm_i915_gem_object *obj = overlay->vid_bo; in intel_overlay_off_tail()
327 overlay->vid_bo = NULL; in intel_overlay_off_tail()
329 overlay->crtc->overlay = NULL; in intel_overlay_off_tail()
330 overlay->crtc = NULL; in intel_overlay_off_tail()
331 overlay->active = false; in intel_overlay_off_tail()
335 static int intel_overlay_off(struct intel_overlay *overlay) in intel_overlay_off() argument
337 struct drm_device *dev = overlay->dev; in intel_overlay_off()
341 u32 flip_addr = overlay->flip_addr; in intel_overlay_off()
344 WARN_ON(!overlay->active); in intel_overlay_off()
380 return intel_overlay_do_wait_request(overlay, req, intel_overlay_off_tail); in intel_overlay_off()
385 static int intel_overlay_recover_from_interrupt(struct intel_overlay *overlay) in intel_overlay_recover_from_interrupt() argument
389 if (overlay->last_flip_req == NULL) in intel_overlay_recover_from_interrupt()
392 ret = i915_wait_request(overlay->last_flip_req); in intel_overlay_recover_from_interrupt()
396 if (overlay->flip_tail) in intel_overlay_recover_from_interrupt()
397 overlay->flip_tail(overlay); in intel_overlay_recover_from_interrupt()
399 i915_gem_request_assign(&overlay->last_flip_req, NULL); in intel_overlay_recover_from_interrupt()
407 static int intel_overlay_release_old_vid(struct intel_overlay *overlay) in intel_overlay_release_old_vid() argument
409 struct drm_device *dev = overlay->dev; in intel_overlay_release_old_vid()
419 if (!overlay->old_vid_bo) in intel_overlay_release_old_vid()
440 ret = intel_overlay_do_wait_request(overlay, req, in intel_overlay_release_old_vid()
446 intel_overlay_release_old_vid_tail(overlay); in intel_overlay_release_old_vid()
449 i915_gem_track_fb(overlay->old_vid_bo, NULL, in intel_overlay_release_old_vid()
450 INTEL_FRONTBUFFER_OVERLAY(overlay->crtc->pipe)); in intel_overlay_release_old_vid()
456 struct intel_overlay *overlay = dev_priv->overlay; in intel_overlay_reset() local
458 if (!overlay) in intel_overlay_reset()
461 intel_overlay_release_old_vid(overlay); in intel_overlay_reset()
463 overlay->last_flip_req = NULL; in intel_overlay_reset()
464 overlay->old_xscale = 0; in intel_overlay_reset()
465 overlay->old_yscale = 0; in intel_overlay_reset()
466 overlay->crtc = NULL; in intel_overlay_reset()
467 overlay->active = false; in intel_overlay_reset()
593 static bool update_scaling_factors(struct intel_overlay *overlay, in update_scaling_factors() argument
628 if (xscale != overlay->old_xscale || yscale != overlay->old_yscale) in update_scaling_factors()
630 overlay->old_xscale = xscale; in update_scaling_factors()
631 overlay->old_yscale = yscale; in update_scaling_factors()
653 static void update_colorkey(struct intel_overlay *overlay, in update_colorkey() argument
656 u32 key = overlay->color_key; in update_colorkey()
660 if (overlay->color_key_enabled) in update_colorkey()
663 switch (overlay->crtc->base.primary->fb->bits_per_pixel) { in update_colorkey()
670 if (overlay->crtc->base.primary->fb->depth == 15) { in update_colorkey()
734 static int intel_overlay_do_put_image(struct intel_overlay *overlay, in intel_overlay_do_put_image() argument
741 struct drm_device *dev = overlay->dev; in intel_overlay_do_put_image()
743 enum pipe pipe = overlay->crtc->pipe; in intel_overlay_do_put_image()
748 ret = intel_overlay_release_old_vid(overlay); in intel_overlay_do_put_image()
761 if (!overlay->active) { in intel_overlay_do_put_image()
763 regs = intel_overlay_map_regs(overlay); in intel_overlay_do_put_image()
769 if (IS_GEN4(overlay->dev)) in intel_overlay_do_put_image()
774 intel_overlay_unmap_regs(overlay, regs); in intel_overlay_do_put_image()
776 ret = intel_overlay_on(overlay); in intel_overlay_do_put_image()
781 regs = intel_overlay_map_regs(overlay); in intel_overlay_do_put_image()
796 swidthsw = calc_swidthsw(overlay->dev, params->offset_Y, tmp_width); in intel_overlay_do_put_image()
806 tmp_U = calc_swidthsw(overlay->dev, params->offset_U, in intel_overlay_do_put_image()
808 tmp_V = calc_swidthsw(overlay->dev, params->offset_V, in intel_overlay_do_put_image()
822 scale_changed = update_scaling_factors(overlay, regs, params); in intel_overlay_do_put_image()
824 update_colorkey(overlay, regs); in intel_overlay_do_put_image()
828 intel_overlay_unmap_regs(overlay, regs); in intel_overlay_do_put_image()
830 ret = intel_overlay_continue(overlay, scale_changed); in intel_overlay_do_put_image()
834 i915_gem_track_fb(overlay->vid_bo, new_bo, in intel_overlay_do_put_image()
837 overlay->old_vid_bo = overlay->vid_bo; in intel_overlay_do_put_image()
838 overlay->vid_bo = new_bo; in intel_overlay_do_put_image()
850 int intel_overlay_switch_off(struct intel_overlay *overlay) in intel_overlay_switch_off() argument
853 struct drm_device *dev = overlay->dev; in intel_overlay_switch_off()
859 ret = intel_overlay_recover_from_interrupt(overlay); in intel_overlay_switch_off()
863 if (!overlay->active) in intel_overlay_switch_off()
866 ret = intel_overlay_release_old_vid(overlay); in intel_overlay_switch_off()
870 regs = intel_overlay_map_regs(overlay); in intel_overlay_switch_off()
872 intel_overlay_unmap_regs(overlay, regs); in intel_overlay_switch_off()
874 ret = intel_overlay_off(overlay); in intel_overlay_switch_off()
878 intel_overlay_off_tail(overlay); in intel_overlay_switch_off()
882 static int check_overlay_possible_on_crtc(struct intel_overlay *overlay, in check_overlay_possible_on_crtc() argument
895 static void update_pfit_vscale_ratio(struct intel_overlay *overlay) in update_pfit_vscale_ratio() argument
897 struct drm_device *dev = overlay->dev; in update_pfit_vscale_ratio()
916 overlay->pfit_vscale_ratio = ratio; in update_pfit_vscale_ratio()
919 static int check_overlay_dst(struct intel_overlay *overlay, in check_overlay_dst() argument
922 struct drm_display_mode *mode = &overlay->crtc->base.mode; in check_overlay_dst()
1091 struct intel_overlay *overlay; in intel_overlay_put_image() local
1098 overlay = dev_priv->overlay; in intel_overlay_put_image()
1099 if (!overlay) { in intel_overlay_put_image()
1108 ret = intel_overlay_switch_off(overlay); in intel_overlay_put_image()
1143 ret = intel_overlay_recover_from_interrupt(overlay); in intel_overlay_put_image()
1147 if (overlay->crtc != crtc) { in intel_overlay_put_image()
1149 ret = intel_overlay_switch_off(overlay); in intel_overlay_put_image()
1153 ret = check_overlay_possible_on_crtc(overlay, crtc); in intel_overlay_put_image()
1157 overlay->crtc = crtc; in intel_overlay_put_image()
1158 crtc->overlay = overlay; in intel_overlay_put_image()
1163 overlay->pfit_active = true; in intel_overlay_put_image()
1164 update_pfit_vscale_ratio(overlay); in intel_overlay_put_image()
1166 overlay->pfit_active = false; in intel_overlay_put_image()
1169 ret = check_overlay_dst(overlay, put_image_rec); in intel_overlay_put_image()
1173 if (overlay->pfit_active) { in intel_overlay_put_image()
1175 overlay->pfit_vscale_ratio); in intel_overlay_put_image()
1178 overlay->pfit_vscale_ratio) + 1; in intel_overlay_put_image()
1211 ret = intel_overlay_do_put_image(overlay, new_bo, params); in intel_overlay_put_image()
1232 static void update_reg_attrs(struct intel_overlay *overlay, in update_reg_attrs() argument
1235 iowrite32((overlay->contrast << 18) | (overlay->brightness & 0xff), in update_reg_attrs()
1237 iowrite32(overlay->saturation, &regs->OCLRC1); in update_reg_attrs()
1289 struct intel_overlay *overlay; in intel_overlay_attrs() local
1293 overlay = dev_priv->overlay; in intel_overlay_attrs()
1294 if (!overlay) { in intel_overlay_attrs()
1304 attrs->color_key = overlay->color_key; in intel_overlay_attrs()
1305 attrs->brightness = overlay->brightness; in intel_overlay_attrs()
1306 attrs->contrast = overlay->contrast; in intel_overlay_attrs()
1307 attrs->saturation = overlay->saturation; in intel_overlay_attrs()
1325 overlay->color_key = attrs->color_key; in intel_overlay_attrs()
1326 overlay->brightness = attrs->brightness; in intel_overlay_attrs()
1327 overlay->contrast = attrs->contrast; in intel_overlay_attrs()
1328 overlay->saturation = attrs->saturation; in intel_overlay_attrs()
1330 regs = intel_overlay_map_regs(overlay); in intel_overlay_attrs()
1336 update_reg_attrs(overlay, regs); in intel_overlay_attrs()
1338 intel_overlay_unmap_regs(overlay, regs); in intel_overlay_attrs()
1344 if (overlay->active) { in intel_overlay_attrs()
1361 overlay->color_key_enabled = (attrs->flags & I915_OVERLAY_DISABLE_DEST_COLORKEY) == 0; in intel_overlay_attrs()
1374 struct intel_overlay *overlay; in intel_setup_overlay() local
1382 overlay = kzalloc(sizeof(*overlay), GFP_KERNEL); in intel_setup_overlay()
1383 if (!overlay) in intel_setup_overlay()
1387 if (WARN_ON(dev_priv->overlay)) in intel_setup_overlay()
1390 overlay->dev = dev; in intel_setup_overlay()
1399 overlay->reg_bo = reg_bo; in intel_setup_overlay()
1407 overlay->flip_addr = reg_bo->phys_handle->busaddr; in intel_setup_overlay()
1414 overlay->flip_addr = i915_gem_obj_ggtt_offset(reg_bo); in intel_setup_overlay()
1424 overlay->color_key = 0x0101fe; in intel_setup_overlay()
1425 overlay->color_key_enabled = true; in intel_setup_overlay()
1426 overlay->brightness = -19; in intel_setup_overlay()
1427 overlay->contrast = 75; in intel_setup_overlay()
1428 overlay->saturation = 146; in intel_setup_overlay()
1430 regs = intel_overlay_map_regs(overlay); in intel_setup_overlay()
1436 update_reg_attrs(overlay, regs); in intel_setup_overlay()
1438 intel_overlay_unmap_regs(overlay, regs); in intel_setup_overlay()
1440 dev_priv->overlay = overlay; in intel_setup_overlay()
1452 kfree(overlay); in intel_setup_overlay()
1460 if (!dev_priv->overlay) in intel_cleanup_overlay()
1466 WARN_ON(dev_priv->overlay->active); in intel_cleanup_overlay()
1468 drm_gem_object_unreference_unlocked(&dev_priv->overlay->reg_bo->base); in intel_cleanup_overlay()
1469 kfree(dev_priv->overlay); in intel_cleanup_overlay()
1480 intel_overlay_map_regs_atomic(struct intel_overlay *overlay) in intel_overlay_map_regs_atomic() argument
1482 struct drm_i915_private *dev_priv = overlay->dev->dev_private; in intel_overlay_map_regs_atomic()
1485 if (OVERLAY_NEEDS_PHYSICAL(overlay->dev)) in intel_overlay_map_regs_atomic()
1489 overlay->reg_bo->phys_handle->vaddr; in intel_overlay_map_regs_atomic()
1492 i915_gem_obj_ggtt_offset(overlay->reg_bo)); in intel_overlay_map_regs_atomic()
1497 static void intel_overlay_unmap_regs_atomic(struct intel_overlay *overlay, in intel_overlay_unmap_regs_atomic() argument
1500 if (!OVERLAY_NEEDS_PHYSICAL(overlay->dev)) in intel_overlay_unmap_regs_atomic()
1509 struct intel_overlay *overlay = dev_priv->overlay; in intel_overlay_capture_error_state() local
1513 if (!overlay || !overlay->active) in intel_overlay_capture_error_state()
1522 if (OVERLAY_NEEDS_PHYSICAL(overlay->dev)) in intel_overlay_capture_error_state()
1523 error->base = (__force long)overlay->reg_bo->phys_handle->vaddr; in intel_overlay_capture_error_state()
1525 error->base = i915_gem_obj_ggtt_offset(overlay->reg_bo); in intel_overlay_capture_error_state()
1527 regs = intel_overlay_map_regs_atomic(overlay); in intel_overlay_capture_error_state()
1532 intel_overlay_unmap_regs_atomic(overlay, regs); in intel_overlay_capture_error_state()