Lines Matching full:overlay

46 /* Limits for overlay size. According to intel doc, the real limits are:
56 /* overlay register definitions */
119 /* overlay flip addr flag */
130 /* memory bufferd overlay registers */
233 alloc_request(struct intel_overlay *overlay, void (*fn)(struct intel_overlay *)) in alloc_request() argument
238 overlay->flip_complete = fn; in alloc_request()
240 rq = i915_request_create(overlay->context); in alloc_request()
244 err = i915_active_add_request(&overlay->last_flip, rq); in alloc_request()
253 /* overlay needs to be disable in OCMD reg */
254 static int intel_overlay_on(struct intel_overlay *overlay) in intel_overlay_on() argument
256 struct intel_display *display = overlay->display; in intel_overlay_on()
260 drm_WARN_ON(display->drm, overlay->active); in intel_overlay_on()
262 rq = alloc_request(overlay, NULL); in intel_overlay_on()
272 overlay->active = true; in intel_overlay_on()
278 *cs++ = overlay->flip_addr | OFC_UPDATE; in intel_overlay_on()
285 return i915_active_wait(&overlay->last_flip); in intel_overlay_on()
288 static void intel_overlay_flip_prepare(struct intel_overlay *overlay, in intel_overlay_flip_prepare() argument
291 struct intel_display *display = overlay->display; in intel_overlay_flip_prepare()
293 enum pipe pipe = overlay->crtc->pipe; in intel_overlay_flip_prepare()
296 drm_WARN_ON(display->drm, overlay->old_vma); in intel_overlay_flip_prepare()
301 intel_frontbuffer_track(overlay->frontbuffer, frontbuffer, in intel_overlay_flip_prepare()
304 if (overlay->frontbuffer) in intel_overlay_flip_prepare()
305 intel_frontbuffer_put(overlay->frontbuffer); in intel_overlay_flip_prepare()
306 overlay->frontbuffer = frontbuffer; in intel_overlay_flip_prepare()
310 overlay->old_vma = overlay->vma; in intel_overlay_flip_prepare()
312 overlay->vma = i915_vma_get(vma); in intel_overlay_flip_prepare()
314 overlay->vma = NULL; in intel_overlay_flip_prepare()
317 /* overlay needs to be enabled in OCMD reg */
318 static int intel_overlay_continue(struct intel_overlay *overlay, in intel_overlay_continue() argument
322 struct intel_display *display = overlay->display; in intel_overlay_continue()
324 u32 flip_addr = overlay->flip_addr; in intel_overlay_continue()
327 drm_WARN_ON(display->drm, !overlay->active); in intel_overlay_continue()
335 drm_dbg(display->drm, "overlay underrun, DOVSTA: %x\n", tmp); in intel_overlay_continue()
337 rq = alloc_request(overlay, NULL); in intel_overlay_continue()
351 intel_overlay_flip_prepare(overlay, vma); in intel_overlay_continue()
357 static void intel_overlay_release_old_vma(struct intel_overlay *overlay) in intel_overlay_release_old_vma() argument
359 struct intel_display *display = overlay->display; in intel_overlay_release_old_vma()
363 vma = fetch_and_zero(&overlay->old_vma); in intel_overlay_release_old_vma()
367 intel_frontbuffer_flip_complete(i915, INTEL_FRONTBUFFER_OVERLAY(overlay->crtc->pipe)); in intel_overlay_release_old_vma()
374 intel_overlay_release_old_vid_tail(struct intel_overlay *overlay) in intel_overlay_release_old_vid_tail() argument
376 intel_overlay_release_old_vma(overlay); in intel_overlay_release_old_vid_tail()
379 static void intel_overlay_off_tail(struct intel_overlay *overlay) in intel_overlay_off_tail() argument
381 struct intel_display *display = overlay->display; in intel_overlay_off_tail()
383 intel_overlay_release_old_vma(overlay); in intel_overlay_off_tail()
385 overlay->crtc->overlay = NULL; in intel_overlay_off_tail()
386 overlay->crtc = NULL; in intel_overlay_off_tail()
387 overlay->active = false; in intel_overlay_off_tail()
395 struct intel_overlay *overlay = in intel_overlay_last_flip_retire() local
396 container_of(active, typeof(*overlay), last_flip); in intel_overlay_last_flip_retire()
398 if (overlay->flip_complete) in intel_overlay_last_flip_retire()
399 overlay->flip_complete(overlay); in intel_overlay_last_flip_retire()
402 /* overlay needs to be disabled in OCMD reg */
403 static int intel_overlay_off(struct intel_overlay *overlay) in intel_overlay_off() argument
405 struct intel_display *display = overlay->display; in intel_overlay_off()
407 u32 *cs, flip_addr = overlay->flip_addr; in intel_overlay_off()
409 drm_WARN_ON(display->drm, !overlay->active); in intel_overlay_off()
411 /* According to intel docs the overlay hw may hang (when switching in intel_overlay_off()
413 * this applies to the disabling of the overlay or to the switching off in intel_overlay_off()
417 rq = alloc_request(overlay, intel_overlay_off_tail); in intel_overlay_off()
427 /* wait for overlay to go idle */ in intel_overlay_off()
432 /* turn overlay off */ in intel_overlay_off()
439 intel_overlay_flip_prepare(overlay, NULL); in intel_overlay_off()
442 return i915_active_wait(&overlay->last_flip); in intel_overlay_off()
447 static int intel_overlay_recover_from_interrupt(struct intel_overlay *overlay) in intel_overlay_recover_from_interrupt() argument
449 return i915_active_wait(&overlay->last_flip); in intel_overlay_recover_from_interrupt()
452 /* Wait for pending overlay flip and release old frame.
453 * Needs to be called before the overlay register are changed
456 static int intel_overlay_release_old_vid(struct intel_overlay *overlay) in intel_overlay_release_old_vid() argument
458 struct intel_display *display = overlay->display; in intel_overlay_release_old_vid()
466 if (!overlay->old_vma) in intel_overlay_release_old_vid()
470 intel_overlay_release_old_vid_tail(overlay); in intel_overlay_release_old_vid()
474 rq = alloc_request(overlay, intel_overlay_release_old_vid_tail); in intel_overlay_release_old_vid()
490 return i915_active_wait(&overlay->last_flip); in intel_overlay_release_old_vid()
495 struct intel_overlay *overlay = display->overlay; in intel_overlay_reset() local
497 if (!overlay) in intel_overlay_reset()
500 overlay->old_xscale = 0; in intel_overlay_reset()
501 overlay->old_yscale = 0; in intel_overlay_reset()
502 overlay->crtc = NULL; in intel_overlay_reset()
503 overlay->active = false; in intel_overlay_reset()
618 static bool update_scaling_factors(struct intel_overlay *overlay, in update_scaling_factors() argument
653 if (xscale != overlay->old_xscale || yscale != overlay->old_yscale) in update_scaling_factors()
655 overlay->old_xscale = xscale; in update_scaling_factors()
656 overlay->old_yscale = yscale; in update_scaling_factors()
678 static void update_colorkey(struct intel_overlay *overlay, in update_colorkey() argument
682 to_intel_plane_state(overlay->crtc->base.primary->state); in update_colorkey()
683 u32 key = overlay->color_key; in update_colorkey()
687 if (overlay->color_key_enabled) in update_colorkey()
791 static int intel_overlay_do_put_image(struct intel_overlay *overlay, in intel_overlay_do_put_image() argument
795 struct intel_display *display = overlay->display; in intel_overlay_do_put_image()
797 struct overlay_registers __iomem *regs = overlay->regs; in intel_overlay_do_put_image()
799 enum pipe pipe = overlay->crtc->pipe; in intel_overlay_do_put_image()
807 ret = intel_overlay_release_old_vid(overlay); in intel_overlay_do_put_image()
821 if (!overlay->active) { in intel_overlay_do_put_image()
823 overlay->crtc->config; in intel_overlay_do_put_image()
837 ret = intel_overlay_on(overlay); in intel_overlay_do_put_image()
884 scale_changed = update_scaling_factors(overlay, regs, params); in intel_overlay_do_put_image()
886 update_colorkey(overlay, regs); in intel_overlay_do_put_image()
890 ret = intel_overlay_continue(overlay, vma, scale_changed); in intel_overlay_do_put_image()
904 int intel_overlay_switch_off(struct intel_overlay *overlay) in intel_overlay_switch_off() argument
906 struct intel_display *display = overlay->display; in intel_overlay_switch_off()
912 ret = intel_overlay_recover_from_interrupt(overlay); in intel_overlay_switch_off()
916 if (!overlay->active) in intel_overlay_switch_off()
919 ret = intel_overlay_release_old_vid(overlay); in intel_overlay_switch_off()
923 iowrite32(0, &overlay->regs->OCMD); in intel_overlay_switch_off()
925 return intel_overlay_off(overlay); in intel_overlay_switch_off()
928 static int check_overlay_possible_on_crtc(struct intel_overlay *overlay, in check_overlay_possible_on_crtc() argument
934 /* can't use the overlay with double wide pipe */ in check_overlay_possible_on_crtc()
941 static void update_pfit_vscale_ratio(struct intel_overlay *overlay) in update_pfit_vscale_ratio() argument
943 struct intel_display *display = overlay->display; in update_pfit_vscale_ratio()
965 overlay->pfit_vscale_ratio = ratio; in update_pfit_vscale_ratio()
968 static int check_overlay_dst(struct intel_overlay *overlay, in check_overlay_dst() argument
972 overlay->crtc->config; in check_overlay_dst()
1121 struct intel_overlay *overlay; in intel_overlay_put_image_ioctl() local
1127 overlay = display->overlay; in intel_overlay_put_image_ioctl()
1128 if (!overlay) { in intel_overlay_put_image_ioctl()
1129 drm_dbg(display->drm, "userspace bug: no overlay\n"); in intel_overlay_put_image_ioctl()
1135 ret = intel_overlay_switch_off(overlay); in intel_overlay_put_image_ioctl()
1154 "buffer used for overlay image can not be tiled\n"); in intel_overlay_put_image_ioctl()
1159 ret = intel_overlay_recover_from_interrupt(overlay); in intel_overlay_put_image_ioctl()
1163 if (overlay->crtc != crtc) { in intel_overlay_put_image_ioctl()
1164 ret = intel_overlay_switch_off(overlay); in intel_overlay_put_image_ioctl()
1168 ret = check_overlay_possible_on_crtc(overlay, crtc); in intel_overlay_put_image_ioctl()
1172 overlay->crtc = crtc; in intel_overlay_put_image_ioctl()
1173 crtc->overlay = overlay; in intel_overlay_put_image_ioctl()
1178 overlay->pfit_active = true; in intel_overlay_put_image_ioctl()
1179 update_pfit_vscale_ratio(overlay); in intel_overlay_put_image_ioctl()
1181 overlay->pfit_active = false; in intel_overlay_put_image_ioctl()
1184 ret = check_overlay_dst(overlay, params); in intel_overlay_put_image_ioctl()
1188 if (overlay->pfit_active) { in intel_overlay_put_image_ioctl()
1190 overlay->pfit_vscale_ratio); in intel_overlay_put_image_ioctl()
1193 overlay->pfit_vscale_ratio) + 1; in intel_overlay_put_image_ioctl()
1211 ret = intel_overlay_do_put_image(overlay, new_bo, params); in intel_overlay_put_image_ioctl()
1227 static void update_reg_attrs(struct intel_overlay *overlay, in update_reg_attrs() argument
1230 iowrite32((overlay->contrast << 18) | (overlay->brightness & 0xff), in update_reg_attrs()
1232 iowrite32(overlay->saturation, &regs->OCLRC1); in update_reg_attrs()
1284 struct intel_overlay *overlay; in intel_overlay_attrs_ioctl() local
1287 overlay = display->overlay; in intel_overlay_attrs_ioctl()
1288 if (!overlay) { in intel_overlay_attrs_ioctl()
1289 drm_dbg(display->drm, "userspace bug: no overlay\n"); in intel_overlay_attrs_ioctl()
1297 attrs->color_key = overlay->color_key; in intel_overlay_attrs_ioctl()
1298 attrs->brightness = overlay->brightness; in intel_overlay_attrs_ioctl()
1299 attrs->contrast = overlay->contrast; in intel_overlay_attrs_ioctl()
1300 attrs->saturation = overlay->saturation; in intel_overlay_attrs_ioctl()
1318 overlay->color_key = attrs->color_key; in intel_overlay_attrs_ioctl()
1319 overlay->brightness = attrs->brightness; in intel_overlay_attrs_ioctl()
1320 overlay->contrast = attrs->contrast; in intel_overlay_attrs_ioctl()
1321 overlay->saturation = attrs->saturation; in intel_overlay_attrs_ioctl()
1323 update_reg_attrs(overlay, overlay->regs); in intel_overlay_attrs_ioctl()
1329 if (overlay->active) { in intel_overlay_attrs_ioctl()
1346 overlay->color_key_enabled = (attrs->flags & I915_OVERLAY_DISABLE_DEST_COLORKEY) == 0; in intel_overlay_attrs_ioctl()
1355 static int get_registers(struct intel_overlay *overlay, bool use_phys) in get_registers() argument
1357 struct intel_display *display = overlay->display; in get_registers()
1377 overlay->flip_addr = sg_dma_address(obj->mm.pages->sgl); in get_registers()
1379 overlay->flip_addr = i915_ggtt_offset(vma); in get_registers()
1380 overlay->regs = i915_vma_pin_iomap(vma); in get_registers()
1383 if (IS_ERR(overlay->regs)) { in get_registers()
1384 err = PTR_ERR(overlay->regs); in get_registers()
1388 overlay->reg_bo = obj; in get_registers()
1399 struct intel_overlay *overlay; in intel_overlay_setup() local
1410 overlay = kzalloc(sizeof(*overlay), GFP_KERNEL); in intel_overlay_setup()
1411 if (!overlay) in intel_overlay_setup()
1414 overlay->display = display; in intel_overlay_setup()
1415 overlay->context = engine->kernel_context; in intel_overlay_setup()
1416 overlay->color_key = 0x0101fe; in intel_overlay_setup()
1417 overlay->color_key_enabled = true; in intel_overlay_setup()
1418 overlay->brightness = -19; in intel_overlay_setup()
1419 overlay->contrast = 75; in intel_overlay_setup()
1420 overlay->saturation = 146; in intel_overlay_setup()
1422 i915_active_init(&overlay->last_flip, in intel_overlay_setup()
1425 ret = get_registers(overlay, OVERLAY_NEEDS_PHYSICAL(display)); in intel_overlay_setup()
1429 memset_io(overlay->regs, 0, sizeof(struct overlay_registers)); in intel_overlay_setup()
1430 update_polyphase_filter(overlay->regs); in intel_overlay_setup()
1431 update_reg_attrs(overlay, overlay->regs); in intel_overlay_setup()
1433 display->overlay = overlay; in intel_overlay_setup()
1434 drm_info(display->drm, "Initialized overlay support.\n"); in intel_overlay_setup()
1438 kfree(overlay); in intel_overlay_setup()
1443 return display->overlay; in intel_overlay_available()
1448 struct intel_overlay *overlay; in intel_overlay_cleanup() local
1450 overlay = fetch_and_zero(&display->overlay); in intel_overlay_cleanup()
1451 if (!overlay) in intel_overlay_cleanup()
1459 drm_WARN_ON(display->drm, overlay->active); in intel_overlay_cleanup()
1461 i915_gem_object_put(overlay->reg_bo); in intel_overlay_cleanup()
1462 i915_active_fini(&overlay->last_flip); in intel_overlay_cleanup()
1464 kfree(overlay); in intel_overlay_cleanup()
1479 struct intel_overlay *overlay = display->overlay; in intel_overlay_snapshot_capture() local
1482 if (!overlay || !overlay->active) in intel_overlay_snapshot_capture()
1491 error->base = overlay->flip_addr; in intel_overlay_snapshot_capture()
1493 memcpy_fromio(&error->regs, overlay->regs, sizeof(error->regs)); in intel_overlay_snapshot_capture()
1505 drm_printf(p, "Overlay, status: 0x%08x, interrupt: 0x%08x\n", in intel_overlay_snapshot_print()