Lines Matching refs:overlay

214 static void intel_overlay_submit_request(struct intel_overlay *overlay,  in intel_overlay_submit_request()  argument
218 GEM_BUG_ON(i915_gem_active_peek(&overlay->last_flip, in intel_overlay_submit_request()
219 &overlay->i915->drm.struct_mutex)); in intel_overlay_submit_request()
220 i915_gem_active_set_retire_fn(&overlay->last_flip, retire, in intel_overlay_submit_request()
221 &overlay->i915->drm.struct_mutex); in intel_overlay_submit_request()
222 i915_gem_active_set(&overlay->last_flip, rq); in intel_overlay_submit_request()
226 static int intel_overlay_do_wait_request(struct intel_overlay *overlay, in intel_overlay_do_wait_request() argument
230 intel_overlay_submit_request(overlay, rq, retire); in intel_overlay_do_wait_request()
231 return i915_gem_active_retire(&overlay->last_flip, in intel_overlay_do_wait_request()
232 &overlay->i915->drm.struct_mutex); in intel_overlay_do_wait_request()
235 static struct i915_request *alloc_request(struct intel_overlay *overlay) in alloc_request() argument
237 struct drm_i915_private *dev_priv = overlay->i915; in alloc_request()
244 static int intel_overlay_on(struct intel_overlay *overlay) in intel_overlay_on() argument
246 struct drm_i915_private *dev_priv = overlay->i915; in intel_overlay_on()
250 WARN_ON(overlay->active); in intel_overlay_on()
252 rq = alloc_request(overlay); in intel_overlay_on()
262 overlay->active = true; in intel_overlay_on()
268 *cs++ = overlay->flip_addr | OFC_UPDATE; in intel_overlay_on()
273 return intel_overlay_do_wait_request(overlay, rq, NULL); in intel_overlay_on()
276 static void intel_overlay_flip_prepare(struct intel_overlay *overlay, in intel_overlay_flip_prepare() argument
279 enum pipe pipe = overlay->crtc->pipe; in intel_overlay_flip_prepare()
281 WARN_ON(overlay->old_vma); in intel_overlay_flip_prepare()
283 i915_gem_track_fb(overlay->vma ? overlay->vma->obj : NULL, in intel_overlay_flip_prepare()
287 intel_frontbuffer_flip_prepare(overlay->i915, in intel_overlay_flip_prepare()
290 overlay->old_vma = overlay->vma; in intel_overlay_flip_prepare()
292 overlay->vma = i915_vma_get(vma); in intel_overlay_flip_prepare()
294 overlay->vma = NULL; in intel_overlay_flip_prepare()
298 static int intel_overlay_continue(struct intel_overlay *overlay, in intel_overlay_continue() argument
302 struct drm_i915_private *dev_priv = overlay->i915; in intel_overlay_continue()
304 u32 flip_addr = overlay->flip_addr; in intel_overlay_continue()
307 WARN_ON(!overlay->active); in intel_overlay_continue()
317 rq = alloc_request(overlay); in intel_overlay_continue()
331 intel_overlay_flip_prepare(overlay, vma); in intel_overlay_continue()
333 intel_overlay_submit_request(overlay, rq, NULL); in intel_overlay_continue()
338 static void intel_overlay_release_old_vma(struct intel_overlay *overlay) in intel_overlay_release_old_vma() argument
342 vma = fetch_and_zero(&overlay->old_vma); in intel_overlay_release_old_vma()
346 intel_frontbuffer_flip_complete(overlay->i915, in intel_overlay_release_old_vma()
347 INTEL_FRONTBUFFER_OVERLAY(overlay->crtc->pipe)); in intel_overlay_release_old_vma()
356 struct intel_overlay *overlay = in intel_overlay_release_old_vid_tail() local
357 container_of(active, typeof(*overlay), last_flip); in intel_overlay_release_old_vid_tail()
359 intel_overlay_release_old_vma(overlay); in intel_overlay_release_old_vid_tail()
365 struct intel_overlay *overlay = in intel_overlay_off_tail() local
366 container_of(active, typeof(*overlay), last_flip); in intel_overlay_off_tail()
367 struct drm_i915_private *dev_priv = overlay->i915; in intel_overlay_off_tail()
369 intel_overlay_release_old_vma(overlay); in intel_overlay_off_tail()
371 overlay->crtc->overlay = NULL; in intel_overlay_off_tail()
372 overlay->crtc = NULL; in intel_overlay_off_tail()
373 overlay->active = false; in intel_overlay_off_tail()
380 static int intel_overlay_off(struct intel_overlay *overlay) in intel_overlay_off() argument
383 u32 *cs, flip_addr = overlay->flip_addr; in intel_overlay_off()
385 WARN_ON(!overlay->active); in intel_overlay_off()
393 rq = alloc_request(overlay); in intel_overlay_off()
415 intel_overlay_flip_prepare(overlay, NULL); in intel_overlay_off()
417 return intel_overlay_do_wait_request(overlay, rq, in intel_overlay_off()
423 static int intel_overlay_recover_from_interrupt(struct intel_overlay *overlay) in intel_overlay_recover_from_interrupt() argument
425 return i915_gem_active_retire(&overlay->last_flip, in intel_overlay_recover_from_interrupt()
426 &overlay->i915->drm.struct_mutex); in intel_overlay_recover_from_interrupt()
433 static int intel_overlay_release_old_vid(struct intel_overlay *overlay) in intel_overlay_release_old_vid() argument
435 struct drm_i915_private *dev_priv = overlay->i915; in intel_overlay_release_old_vid()
444 if (!overlay->old_vma) in intel_overlay_release_old_vid()
451 rq = alloc_request(overlay); in intel_overlay_release_old_vid()
465 ret = intel_overlay_do_wait_request(overlay, rq, in intel_overlay_release_old_vid()
470 intel_overlay_release_old_vid_tail(&overlay->last_flip, NULL); in intel_overlay_release_old_vid()
477 struct intel_overlay *overlay = dev_priv->overlay; in intel_overlay_reset() local
479 if (!overlay) in intel_overlay_reset()
482 intel_overlay_release_old_vid(overlay); in intel_overlay_reset()
484 overlay->old_xscale = 0; in intel_overlay_reset()
485 overlay->old_yscale = 0; in intel_overlay_reset()
486 overlay->crtc = NULL; in intel_overlay_reset()
487 overlay->active = false; in intel_overlay_reset()
619 static bool update_scaling_factors(struct intel_overlay *overlay, in update_scaling_factors() argument
654 if (xscale != overlay->old_xscale || yscale != overlay->old_yscale) in update_scaling_factors()
656 overlay->old_xscale = xscale; in update_scaling_factors()
657 overlay->old_yscale = yscale; in update_scaling_factors()
679 static void update_colorkey(struct intel_overlay *overlay, in update_colorkey() argument
683 to_intel_plane_state(overlay->crtc->base.primary->state); in update_colorkey()
684 u32 key = overlay->color_key; in update_colorkey()
688 if (overlay->color_key_enabled) in update_colorkey()
761 static int intel_overlay_do_put_image(struct intel_overlay *overlay, in intel_overlay_do_put_image() argument
765 struct overlay_registers __iomem *regs = overlay->regs; in intel_overlay_do_put_image()
766 struct drm_i915_private *dev_priv = overlay->i915; in intel_overlay_do_put_image()
768 enum pipe pipe = overlay->crtc->pipe; in intel_overlay_do_put_image()
776 ret = intel_overlay_release_old_vid(overlay); in intel_overlay_do_put_image()
794 if (!overlay->active) { in intel_overlay_do_put_image()
804 ret = intel_overlay_on(overlay); in intel_overlay_do_put_image()
846 scale_changed = update_scaling_factors(overlay, regs, params); in intel_overlay_do_put_image()
848 update_colorkey(overlay, regs); in intel_overlay_do_put_image()
852 ret = intel_overlay_continue(overlay, vma, scale_changed); in intel_overlay_do_put_image()
866 int intel_overlay_switch_off(struct intel_overlay *overlay) in intel_overlay_switch_off() argument
868 struct drm_i915_private *dev_priv = overlay->i915; in intel_overlay_switch_off()
874 ret = intel_overlay_recover_from_interrupt(overlay); in intel_overlay_switch_off()
878 if (!overlay->active) in intel_overlay_switch_off()
881 ret = intel_overlay_release_old_vid(overlay); in intel_overlay_switch_off()
885 iowrite32(0, &overlay->regs->OCMD); in intel_overlay_switch_off()
887 return intel_overlay_off(overlay); in intel_overlay_switch_off()
890 static int check_overlay_possible_on_crtc(struct intel_overlay *overlay, in check_overlay_possible_on_crtc() argument
903 static void update_pfit_vscale_ratio(struct intel_overlay *overlay) in update_pfit_vscale_ratio() argument
905 struct drm_i915_private *dev_priv = overlay->i915; in update_pfit_vscale_ratio()
923 overlay->pfit_vscale_ratio = ratio; in update_pfit_vscale_ratio()
926 static int check_overlay_dst(struct intel_overlay *overlay, in check_overlay_dst() argument
930 overlay->crtc->config; in check_overlay_dst()
1072 struct intel_overlay *overlay; in intel_overlay_put_image_ioctl() local
1079 overlay = dev_priv->overlay; in intel_overlay_put_image_ioctl()
1080 if (!overlay) { in intel_overlay_put_image_ioctl()
1089 ret = intel_overlay_switch_off(overlay); in intel_overlay_put_image_ioctl()
1123 ret = intel_overlay_recover_from_interrupt(overlay); in intel_overlay_put_image_ioctl()
1127 if (overlay->crtc != crtc) { in intel_overlay_put_image_ioctl()
1128 ret = intel_overlay_switch_off(overlay); in intel_overlay_put_image_ioctl()
1132 ret = check_overlay_possible_on_crtc(overlay, crtc); in intel_overlay_put_image_ioctl()
1136 overlay->crtc = crtc; in intel_overlay_put_image_ioctl()
1137 crtc->overlay = overlay; in intel_overlay_put_image_ioctl()
1142 overlay->pfit_active = true; in intel_overlay_put_image_ioctl()
1143 update_pfit_vscale_ratio(overlay); in intel_overlay_put_image_ioctl()
1145 overlay->pfit_active = false; in intel_overlay_put_image_ioctl()
1148 ret = check_overlay_dst(overlay, put_image_rec); in intel_overlay_put_image_ioctl()
1152 if (overlay->pfit_active) { in intel_overlay_put_image_ioctl()
1154 overlay->pfit_vscale_ratio); in intel_overlay_put_image_ioctl()
1157 overlay->pfit_vscale_ratio) + 1; in intel_overlay_put_image_ioctl()
1190 ret = intel_overlay_do_put_image(overlay, new_bo, params); in intel_overlay_put_image_ioctl()
1212 static void update_reg_attrs(struct intel_overlay *overlay, in update_reg_attrs() argument
1215 iowrite32((overlay->contrast << 18) | (overlay->brightness & 0xff), in update_reg_attrs()
1217 iowrite32(overlay->saturation, &regs->OCLRC1); in update_reg_attrs()
1269 struct intel_overlay *overlay; in intel_overlay_attrs_ioctl() local
1272 overlay = dev_priv->overlay; in intel_overlay_attrs_ioctl()
1273 if (!overlay) { in intel_overlay_attrs_ioctl()
1283 attrs->color_key = overlay->color_key; in intel_overlay_attrs_ioctl()
1284 attrs->brightness = overlay->brightness; in intel_overlay_attrs_ioctl()
1285 attrs->contrast = overlay->contrast; in intel_overlay_attrs_ioctl()
1286 attrs->saturation = overlay->saturation; in intel_overlay_attrs_ioctl()
1304 overlay->color_key = attrs->color_key; in intel_overlay_attrs_ioctl()
1305 overlay->brightness = attrs->brightness; in intel_overlay_attrs_ioctl()
1306 overlay->contrast = attrs->contrast; in intel_overlay_attrs_ioctl()
1307 overlay->saturation = attrs->saturation; in intel_overlay_attrs_ioctl()
1309 update_reg_attrs(overlay, overlay->regs); in intel_overlay_attrs_ioctl()
1315 if (overlay->active) { in intel_overlay_attrs_ioctl()
1332 overlay->color_key_enabled = (attrs->flags & I915_OVERLAY_DISABLE_DEST_COLORKEY) == 0; in intel_overlay_attrs_ioctl()
1342 static int get_registers(struct intel_overlay *overlay, bool use_phys) in get_registers() argument
1348 obj = i915_gem_object_create_stolen(overlay->i915, PAGE_SIZE); in get_registers()
1350 obj = i915_gem_object_create_internal(overlay->i915, PAGE_SIZE); in get_registers()
1361 overlay->flip_addr = sg_dma_address(obj->mm.pages->sgl); in get_registers()
1363 overlay->flip_addr = i915_ggtt_offset(vma); in get_registers()
1364 overlay->regs = i915_vma_pin_iomap(vma); in get_registers()
1367 if (IS_ERR(overlay->regs)) { in get_registers()
1368 err = PTR_ERR(overlay->regs); in get_registers()
1372 overlay->reg_bo = obj; in get_registers()
1382 struct intel_overlay *overlay; in intel_setup_overlay() local
1388 overlay = kzalloc(sizeof(*overlay), GFP_KERNEL); in intel_setup_overlay()
1389 if (!overlay) in intel_setup_overlay()
1392 overlay->i915 = dev_priv; in intel_setup_overlay()
1394 overlay->color_key = 0x0101fe; in intel_setup_overlay()
1395 overlay->color_key_enabled = true; in intel_setup_overlay()
1396 overlay->brightness = -19; in intel_setup_overlay()
1397 overlay->contrast = 75; in intel_setup_overlay()
1398 overlay->saturation = 146; in intel_setup_overlay()
1400 init_request_active(&overlay->last_flip, NULL); in intel_setup_overlay()
1404 ret = get_registers(overlay, OVERLAY_NEEDS_PHYSICAL(dev_priv)); in intel_setup_overlay()
1408 ret = i915_gem_object_set_to_gtt_domain(overlay->reg_bo, true); in intel_setup_overlay()
1414 memset_io(overlay->regs, 0, sizeof(struct overlay_registers)); in intel_setup_overlay()
1415 update_polyphase_filter(overlay->regs); in intel_setup_overlay()
1416 update_reg_attrs(overlay, overlay->regs); in intel_setup_overlay()
1418 dev_priv->overlay = overlay; in intel_setup_overlay()
1423 i915_gem_object_put(overlay->reg_bo); in intel_setup_overlay()
1426 kfree(overlay); in intel_setup_overlay()
1431 struct intel_overlay *overlay; in intel_cleanup_overlay() local
1433 overlay = fetch_and_zero(&dev_priv->overlay); in intel_cleanup_overlay()
1434 if (!overlay) in intel_cleanup_overlay()
1442 WARN_ON(overlay->active); in intel_cleanup_overlay()
1444 i915_gem_object_put(overlay->reg_bo); in intel_cleanup_overlay()
1446 kfree(overlay); in intel_cleanup_overlay()
1461 struct intel_overlay *overlay = dev_priv->overlay; in intel_overlay_capture_error_state() local
1464 if (!overlay || !overlay->active) in intel_overlay_capture_error_state()
1473 error->base = overlay->flip_addr; in intel_overlay_capture_error_state()
1475 memcpy_fromio(&error->regs, overlay->regs, sizeof(error->regs)); in intel_overlay_capture_error_state()