[Intel-gfx] [PATCH 5/7] drm/i915: Use the plane state for cursor updates.
Ville Syrjälä
ville.syrjala at linux.intel.com
Thu Jan 7 04:29:49 PST 2016
On Thu, Jan 07, 2016 at 11:54:10AM +0100, Maarten Lankhorst wrote:
> Cursor planes grab the state from plane->state instead of the state
> that was passed. The only updates are atomic now, so use the plane_state
> that's passed in.
>
> Signed-off-by: Maarten Lankhorst <maarten.lankhorst at linux.intel.com>
Again clashes a bit with my pending stuff. But like said, I can
rebase.
Reviewed-by: Ville Syrjälä <ville.syrjala at linux.intel.com>
> ---
> drivers/gpu/drm/i915/intel_display.c | 92 ++++++++++++++++++------------------
> 1 file changed, 46 insertions(+), 46 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
> index 7ea49d5e2ce0..f7c293638df4 100644
> --- a/drivers/gpu/drm/i915/intel_display.c
> +++ b/drivers/gpu/drm/i915/intel_display.c
> @@ -10076,16 +10076,17 @@ static bool haswell_get_pipe_config(struct intel_crtc *crtc,
> return true;
> }
>
> -static void i845_update_cursor(struct drm_crtc *crtc, u32 base, bool on)
> +static void i845_update_cursor(struct drm_crtc *crtc, u32 base,
> + const struct intel_plane_state *plane_state)
> {
> struct drm_device *dev = crtc->dev;
> struct drm_i915_private *dev_priv = dev->dev_private;
> struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
> uint32_t cntl = 0, size = 0;
>
> - if (on) {
> - unsigned int width = intel_crtc->base.cursor->state->crtc_w;
> - unsigned int height = intel_crtc->base.cursor->state->crtc_h;
> + if (plane_state && plane_state->visible) {
> + unsigned int width = plane_state->base.crtc_w;
> + unsigned int height = plane_state->base.crtc_h;
> unsigned int stride = roundup_pow_of_two(width) * 4;
>
> switch (stride) {
> @@ -10138,7 +10139,8 @@ static void i845_update_cursor(struct drm_crtc *crtc, u32 base, bool on)
> }
> }
>
> -static void i9xx_update_cursor(struct drm_crtc *crtc, u32 base, bool on)
> +static void i9xx_update_cursor(struct drm_crtc *crtc, u32 base,
> + const struct intel_plane_state *plane_state)
> {
> struct drm_device *dev = crtc->dev;
> struct drm_i915_private *dev_priv = dev->dev_private;
> @@ -10146,9 +10148,9 @@ static void i9xx_update_cursor(struct drm_crtc *crtc, u32 base, bool on)
> int pipe = intel_crtc->pipe;
> uint32_t cntl = 0;
>
> - if (on) {
> + if (plane_state && plane_state->visible) {
> cntl = MCURSOR_GAMMA_ENABLE;
> - switch (intel_crtc->base.cursor->state->crtc_w) {
> + switch (plane_state->base.crtc_w) {
> case 64:
> cntl |= CURSOR_MODE_64_ARGB_AX;
> break;
> @@ -10159,17 +10161,17 @@ static void i9xx_update_cursor(struct drm_crtc *crtc, u32 base, bool on)
> cntl |= CURSOR_MODE_256_ARGB_AX;
> break;
> default:
> - MISSING_CASE(intel_crtc->base.cursor->state->crtc_w);
> + MISSING_CASE(plane_state->base.crtc_w);
> return;
> }
> cntl |= pipe << 28; /* Connect to correct pipe */
>
> if (HAS_DDI(dev))
> cntl |= CURSOR_PIPE_CSC_ENABLE;
> - }
>
> - if (crtc->cursor->state->rotation == BIT(DRM_ROTATE_180))
> - cntl |= CURSOR_ROTATE_180;
> + if (plane_state->base.rotation == BIT(DRM_ROTATE_180))
> + cntl |= CURSOR_ROTATE_180;
> + }
>
> if (intel_crtc->cursor_cntl != cntl) {
> I915_WRITE(CURCNTR(pipe), cntl);
> @@ -10186,44 +10188,45 @@ static void i9xx_update_cursor(struct drm_crtc *crtc, u32 base, bool on)
>
> /* If no-part of the cursor is visible on the framebuffer, then the GPU may hang... */
> static void intel_crtc_update_cursor(struct drm_crtc *crtc,
> - bool on)
> + const struct intel_plane_state *plane_state)
> {
> struct drm_device *dev = crtc->dev;
> struct drm_i915_private *dev_priv = dev->dev_private;
> struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
> int pipe = intel_crtc->pipe;
> - struct drm_plane_state *cursor_state = crtc->cursor->state;
> - int x = cursor_state->crtc_x;
> - int y = cursor_state->crtc_y;
> - u32 base = 0, pos = 0;
> + u32 base = intel_crtc->cursor_addr;
> + u32 pos = 0;
>
> - base = intel_crtc->cursor_addr;
> + if (plane_state) {
> + int x = plane_state->base.crtc_x;
> + int y = plane_state->base.crtc_y;
>
> - if (x < 0) {
> - pos |= CURSOR_POS_SIGN << CURSOR_X_SHIFT;
> - x = -x;
> - }
> - pos |= x << CURSOR_X_SHIFT;
> + if (x < 0) {
> + pos |= CURSOR_POS_SIGN << CURSOR_X_SHIFT;
> + x = -x;
> + }
> + pos |= x << CURSOR_X_SHIFT;
>
> - if (y < 0) {
> - pos |= CURSOR_POS_SIGN << CURSOR_Y_SHIFT;
> - y = -y;
> + if (y < 0) {
> + pos |= CURSOR_POS_SIGN << CURSOR_Y_SHIFT;
> + y = -y;
> + }
> + pos |= y << CURSOR_Y_SHIFT;
> +
> + /* ILK+ do this automagically */
> + if (HAS_GMCH_DISPLAY(dev) &&
> + plane_state->base.rotation == BIT(DRM_ROTATE_180)) {
> + base += (plane_state->base.crtc_h *
> + plane_state->base.crtc_w - 1) * 4;
> + }
> }
> - pos |= y << CURSOR_Y_SHIFT;
>
> I915_WRITE(CURPOS(pipe), pos);
>
> - /* ILK+ do this automagically */
> - if (HAS_GMCH_DISPLAY(dev) &&
> - crtc->cursor->state->rotation == BIT(DRM_ROTATE_180)) {
> - base += (cursor_state->crtc_h *
> - cursor_state->crtc_w - 1) * 4;
> - }
> -
> if (IS_845G(dev) || IS_I865G(dev))
> - i845_update_cursor(crtc, base, on);
> + i845_update_cursor(crtc, base, plane_state);
> else
> - i9xx_update_cursor(crtc, base, on);
> + i9xx_update_cursor(crtc, base, plane_state);
> }
>
> static bool cursor_size_ok(struct drm_device *dev,
> @@ -14180,22 +14183,20 @@ intel_disable_cursor_plane(struct drm_plane *plane,
> struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
>
> intel_crtc->cursor_addr = 0;
> - intel_crtc_update_cursor(crtc, false);
> + intel_crtc_update_cursor(crtc, NULL);
> }
>
> static void
> -intel_commit_cursor_plane(struct drm_plane *plane,
> - struct intel_plane_state *state)
> +intel_update_cursor_plane(struct drm_plane *plane,
> + const struct intel_crtc_state *crtc_state,
> + const struct intel_plane_state *state)
> {
> - struct drm_crtc *crtc = state->base.crtc;
> + struct drm_crtc *crtc = crtc_state->base.crtc;
> + struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
> struct drm_device *dev = plane->dev;
> - struct intel_crtc *intel_crtc;
> struct drm_i915_gem_object *obj = intel_fb_obj(state->base.fb);
> uint32_t addr;
>
> - crtc = crtc ? crtc : plane->crtc;
> - intel_crtc = to_intel_crtc(crtc);
> -
> if (!obj)
> addr = 0;
> else if (!INTEL_INFO(dev)->cursor_needs_physical)
> @@ -14204,8 +14205,7 @@ intel_commit_cursor_plane(struct drm_plane *plane,
> addr = obj->phys_handle->busaddr;
>
> intel_crtc->cursor_addr = addr;
> -
> - intel_crtc_update_cursor(crtc, state->visible);
> + intel_crtc_update_cursor(crtc, state);
> }
>
> static struct drm_plane *intel_cursor_plane_create(struct drm_device *dev,
> @@ -14231,7 +14231,7 @@ static struct drm_plane *intel_cursor_plane_create(struct drm_device *dev,
> cursor->plane = pipe;
> cursor->frontbuffer_bit = INTEL_FRONTBUFFER_CURSOR(pipe);
> cursor->check_plane = intel_check_cursor_plane;
> - cursor->commit_plane = intel_commit_cursor_plane;
> + cursor->update_plane = intel_update_cursor_plane;
> cursor->disable_plane = intel_disable_cursor_plane;
>
> drm_universal_plane_init(dev, &cursor->base, 0,
> --
> 2.1.0
>
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx
--
Ville Syrjälä
Intel OTC
More information about the Intel-gfx
mailing list