From: "Ville Syrjälä" <ville.syrjala@linux.intel.com>
To: Gustavo Padovan <gustavo@padovan.org>
Cc: intel-gfx@lists.freedesktop.org,
Gustavo Padovan <gustavo.padovan@collabora.co.uk>,
dri-devel@lists.freedesktop.org
Subject: Re: [PATCH v3 05/11] drm/i915: remove intel_crtc_cursor_set_obj()
Date: Tue, 7 Oct 2014 17:59:33 +0300 [thread overview]
Message-ID: <20141007145933.GX32511@intel.com> (raw)
In-Reply-To: <1411579232-8668-5-git-send-email-gustavo@padovan.org>
On Wed, Sep 24, 2014 at 02:20:26PM -0300, Gustavo Padovan wrote:
> From: Gustavo Padovan <gustavo.padovan@collabora.co.uk>
>
> Merge it into the plane update_plane() callback and make other
> users use the update_plane() functions instead.
>
> The fb != crtc->cursor->fb was already inside intel_crtc_cursor_set_obj()
> so we fold intel_crtc_cursor_set_obj() inside intel_commit_cursor_plane()
> and merge both paths into one.
>
> Signed-off-by: Gustavo Padovan <gustavo.padovan@collabora.co.uk>
> ---
> drivers/gpu/drm/i915/intel_display.c | 221 +++++++++++++++++------------------
> 1 file changed, 106 insertions(+), 115 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
> index f91a5b0..a583abd 100644
> --- a/drivers/gpu/drm/i915/intel_display.c
> +++ b/drivers/gpu/drm/i915/intel_display.c
> @@ -8457,109 +8457,6 @@ static bool cursor_size_ok(struct drm_device *dev,
> return true;
> }
>
> -static int intel_crtc_cursor_set_obj(struct drm_crtc *crtc,
> - struct drm_i915_gem_object *obj,
> - uint32_t width, uint32_t height)
> -{
> - struct drm_device *dev = crtc->dev;
> - struct drm_i915_private *dev_priv = dev->dev_private;
> - struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
> - enum pipe pipe = intel_crtc->pipe;
> - unsigned old_width;
> - uint32_t addr;
> - int ret;
> -
> - /* if we want to turn off the cursor ignore width and height */
> - if (!obj) {
> - DRM_DEBUG_KMS("cursor off\n");
> - addr = 0;
> - mutex_lock(&dev->struct_mutex);
> - goto finish;
> - }
> -
> - /* we only need to pin inside GTT if cursor is non-phy */
> - mutex_lock(&dev->struct_mutex);
> - if (!INTEL_INFO(dev)->cursor_needs_physical) {
> - unsigned alignment;
> -
> - /*
> - * Global gtt pte registers are special registers which actually
> - * forward writes to a chunk of system memory. Which means that
> - * there is no risk that the register values disappear as soon
> - * as we call intel_runtime_pm_put(), so it is correct to wrap
> - * only the pin/unpin/fence and not more.
> - */
> - intel_runtime_pm_get(dev_priv);
> -
> - /* Note that the w/a also requires 2 PTE of padding following
> - * the bo. We currently fill all unused PTE with the shadow
> - * page and so we should always have valid PTE following the
> - * cursor preventing the VT-d warning.
> - */
> - alignment = 0;
> - if (need_vtd_wa(dev))
> - alignment = 64*1024;
> -
> - ret = i915_gem_object_pin_to_display_plane(obj, alignment, NULL);
> - if (ret) {
> - DRM_DEBUG_KMS("failed to move cursor bo into the GTT\n");
> - intel_runtime_pm_put(dev_priv);
> - goto fail_locked;
> - }
> -
> - ret = i915_gem_object_put_fence(obj);
> - if (ret) {
> - DRM_DEBUG_KMS("failed to release fence for cursor");
> - intel_runtime_pm_put(dev_priv);
> - goto fail_unpin;
> - }
> -
> - addr = i915_gem_obj_ggtt_offset(obj);
> -
> - intel_runtime_pm_put(dev_priv);
> - } else {
> - int align = IS_I830(dev) ? 16 * 1024 : 256;
> - ret = i915_gem_object_attach_phys(obj, align);
> - if (ret) {
> - DRM_DEBUG_KMS("failed to attach phys object\n");
> - goto fail_locked;
> - }
> - addr = obj->phys_handle->busaddr;
> - }
> -
> - finish:
> - if (intel_crtc->cursor_bo) {
> - if (!INTEL_INFO(dev)->cursor_needs_physical)
> - i915_gem_object_unpin_from_display_plane(intel_crtc->cursor_bo);
> - }
> -
> - i915_gem_track_fb(intel_crtc->cursor_bo, obj,
> - INTEL_FRONTBUFFER_CURSOR(pipe));
> - mutex_unlock(&dev->struct_mutex);
> -
> - old_width = intel_crtc->cursor_width;
> -
> - intel_crtc->cursor_addr = addr;
> - intel_crtc->cursor_bo = obj;
> - intel_crtc->cursor_width = width;
> - intel_crtc->cursor_height = height;
> -
> - if (intel_crtc->active) {
> - if (old_width != width)
> - intel_update_watermarks(crtc);
> - intel_crtc_update_cursor(crtc, intel_crtc->cursor_bo != NULL);
> - }
> -
> - intel_frontbuffer_flip(dev, INTEL_FRONTBUFFER_CURSOR(pipe));
> -
> - return 0;
> -fail_unpin:
> - i915_gem_object_unpin_from_display_plane(obj);
> -fail_locked:
> - mutex_unlock(&dev->struct_mutex);
> - return ret;
> -}
> -
> static void intel_crtc_gamma_set(struct drm_crtc *crtc, u16 *red, u16 *green,
> u16 *blue, uint32_t start, uint32_t size)
> {
> @@ -11897,7 +11794,8 @@ intel_cursor_plane_disable(struct drm_plane *plane)
>
> BUG_ON(!plane->crtc);
>
> - return intel_crtc_cursor_set_obj(plane->crtc, NULL, 0, 0);
> + return plane->funcs->update_plane(plane, plane->crtc, NULL,
> + 0, 0, 0, 0, 0, 0, 0, 0);
> }
>
> static int
> @@ -11961,26 +11859,119 @@ intel_commit_cursor_plane(struct drm_plane *plane,
> struct intel_plane_state *state)
> {
> struct drm_crtc *crtc = state->crtc;
> + struct drm_device *dev = crtc->dev;
> + struct drm_i915_private *dev_priv = dev->dev_private;
> struct drm_framebuffer *fb = state->fb;
> struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
> - struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb);
> - struct drm_i915_gem_object *obj = intel_fb->obj;
> - int crtc_w, crtc_h;
> + struct drm_i915_gem_object *obj = intel_fb_obj(fb);
> + enum pipe pipe = intel_crtc->pipe;
> + unsigned old_width;
> + uint32_t addr;
> + bool on;
> + int ret;
>
> crtc->cursor_x = state->orig_dst.x1;
> crtc->cursor_y = state->orig_dst.y1;
> - if (fb != crtc->cursor->fb) {
> - crtc_w = drm_rect_width(&state->orig_dst);
> - crtc_h = drm_rect_height(&state->orig_dst);
> - return intel_crtc_cursor_set_obj(crtc, obj, crtc_w, crtc_h);
> +
> + if (intel_crtc->cursor_bo == obj)
> + goto update;
> +
> + /* if we want to turn off the cursor ignore width and height */
> + if (!obj) {
> + DRM_DEBUG_KMS("cursor off\n");
> + addr = 0;
> + mutex_lock(&dev->struct_mutex);
> + goto finish;
> + }
> +
> + /* we only need to pin inside GTT if cursor is non-phy */
> + mutex_lock(&dev->struct_mutex);
> + if (!INTEL_INFO(dev)->cursor_needs_physical) {
> + unsigned alignment;
> +
> + /*
> + * Global gtt pte registers are special registers which actually
> + * forward writes to a chunk of system memory. Which means that
> + * there is no risk that the register values disappear as soon
> + * as we call intel_runtime_pm_put(), so it is correct to wrap
> + * only the pin/unpin/fence and not more.
> + */
> + intel_runtime_pm_get(dev_priv);
> +
> + /* Note that the w/a also requires 2 PTE of padding following
> + * the bo. We currently fill all unused PTE with the shadow
> + * page and so we should always have valid PTE following the
> + * cursor preventing the VT-d warning.
> + */
> + alignment = 0;
> + if (need_vtd_wa(dev))
> + alignment = 64*1024;
> +
> + ret = i915_gem_object_pin_to_display_plane(obj, alignment, NULL);
> + if (ret) {
> + DRM_DEBUG_KMS("failed to move cursor bo into the GTT\n");
> + intel_runtime_pm_put(dev_priv);
> + goto fail_locked;
> + }
> +
> + ret = i915_gem_object_put_fence(obj);
> + if (ret) {
> + DRM_DEBUG_KMS("failed to release fence for cursor");
> + intel_runtime_pm_put(dev_priv);
> + goto fail_unpin;
> + }
> +
> + addr = i915_gem_obj_ggtt_offset(obj);
> +
> + intel_runtime_pm_put(dev_priv);
> } else {
> - intel_crtc_update_cursor(crtc, state->visible);
> + int align = IS_I830(dev) ? 16 * 1024 : 256;
> + ret = i915_gem_object_attach_phys(obj, align);
> + if (ret) {
> + DRM_DEBUG_KMS("failed to attach phys object\n");
> + goto fail_locked;
> + }
> + addr = obj->phys_handle->busaddr;
> + }
>
> - intel_frontbuffer_flip(crtc->dev,
> - INTEL_FRONTBUFFER_CURSOR(intel_crtc->pipe));
> +finish:
> + if (intel_crtc->cursor_bo) {
> + if (!INTEL_INFO(dev)->cursor_needs_physical)
> + i915_gem_object_unpin_from_display_plane(intel_crtc->cursor_bo);
> + }
>
> - return 0;
> + i915_gem_track_fb(intel_crtc->cursor_bo, obj,
> + INTEL_FRONTBUFFER_CURSOR(pipe));
> + mutex_unlock(&dev->struct_mutex);
> +
> + intel_crtc->cursor_addr = addr;
> + intel_crtc->cursor_bo = obj;
> +update:
> + old_width = intel_crtc->cursor_width;
> +
> + intel_crtc->cursor_width = drm_rect_width(&state->orig_dst);
> + intel_crtc->cursor_height = drm_rect_height(&state->orig_dst);
> +
> + if (intel_crtc->cursor_bo == obj)
> + on = state->visible;
> + else
> + on = !obj;
That looks fishy. Why do we need to care if the bo changed here, and why
would we turn on the cursor when there's no bo?
The cursor is either visible or it isn't, and that's all that
intel_crtc_update_cursor() should care about.
> +
> + if (intel_crtc->active) {
> + if (old_width != intel_crtc->cursor_width)
> + intel_update_watermarks(crtc);
> + intel_crtc_update_cursor(crtc, on);
> }
> +
> + intel_frontbuffer_flip(dev, INTEL_FRONTBUFFER_CURSOR(pipe));
This should probably be done only when crtc->active==true. I see we're
not doing it that way currently, so I guess we could have a separate
patch to change that.
> +
> + return 0;
> +fail_unpin:
> + i915_gem_object_unpin_from_display_plane(obj);
> +fail_locked:
> + mutex_unlock(&dev->struct_mutex);
> + drm_gem_object_unreference_unlocked(&obj->base);
> + return ret;
> }
>
> static int
> --
> 1.9.3
>
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx
--
Ville Syrjälä
Intel OTC
next prev parent reply other threads:[~2014-10-07 14:59 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-09-24 17:20 [PATCH v3 01/11] drm/i915: Merge of visible and !visible paths for primary planes Gustavo Padovan
2014-09-24 17:20 ` [PATCH v3 02/11] drm/i915: remove leftover from pre-universal planes days Gustavo Padovan
2014-09-24 17:20 ` [PATCH v3 03/11] drm/i915: Fix not checking cursor and object sizes Gustavo Padovan
2014-09-24 17:20 ` [PATCH v3 04/11] drm/i915: move check of intel_crtc_cursor_set_obj() out Gustavo Padovan
2014-10-07 14:47 ` Ville Syrjälä
2014-10-07 15:01 ` Ville Syrjälä
2014-10-08 9:03 ` [Intel-gfx] " Daniel Vetter
2014-09-24 17:20 ` [PATCH v3 05/11] drm/i915: remove intel_crtc_cursor_set_obj() Gustavo Padovan
2014-10-07 14:59 ` Ville Syrjälä [this message]
2014-10-24 13:23 ` Gustavo Padovan
2014-10-24 14:35 ` Ville Syrjälä
2014-09-24 17:20 ` [PATCH v3 06/11] drm/i915: split intel_crtc_page_flip() into check() and commit() Gustavo Padovan
2014-10-07 15:44 ` Ville Syrjälä
2014-09-24 17:20 ` [PATCH v3 07/11] drm: add helper to get crtc timings Gustavo Padovan
2014-10-07 15:21 ` Ville Syrjälä
2014-09-24 17:20 ` [PATCH v3 08/11] drm/i915: create a prepare step for primary planes updates Gustavo Padovan
2014-09-24 17:20 ` [PATCH v3 09/11] drm/i915: create a prepare phase for sprite plane updates Gustavo Padovan
2014-10-07 15:51 ` Ville Syrjälä
2014-09-24 17:20 ` [PATCH v3 10/11] drm/i915: use intel_fb_obj() macros to assign gem objects Gustavo Padovan
2014-10-07 15:52 ` [Intel-gfx] " Ville Syrjälä
2014-09-24 17:20 ` [PATCH v3 11/11] drm/i915: remove intel_pipe_set_base() Gustavo Padovan
2014-10-07 16:27 ` Ville Syrjälä
2014-10-24 13:59 ` Gustavo Padovan
2014-10-24 14:17 ` Ville Syrjälä
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20141007145933.GX32511@intel.com \
--to=ville.syrjala@linux.intel.com \
--cc=dri-devel@lists.freedesktop.org \
--cc=gustavo.padovan@collabora.co.uk \
--cc=gustavo@padovan.org \
--cc=intel-gfx@lists.freedesktop.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).