[Intel-gfx] [PATCH v2 06/18] drm/i915: Store the final plane stride in plane_state
Souza, Jose
jose.souza at intel.com
Wed Aug 22 23:44:47 UTC 2018
On Fri, 2018-07-20 at 14:06 +0300, Ville Syrjala wrote:
> From: Ville Syrjälä <ville.syrjala at linux.intel.com>
>
> Let's store the final plane stride in the plane state. This avoids
> having to pick betwen the normal vs. rotated stride during hardware
s/betwen/between
> programming. And once we get GTT remapping the plane stride will
> no longer match the fb stride so we'll need a place to store it
> anyway.
>
> v2: Keep checking fb->pitches[0] for cursor as later on we won't
> populate plane_state->color_plane[0].stride for invisible planes
> and we have been checking the cursor fb stride even for invisible
> planes
Reviewed-by: José Roberto de Souza <jose.souza at intel.com>
>
> Signed-off-by: Ville Syrjälä <ville.syrjala at linux.intel.com>
> ---
> drivers/gpu/drm/i915/intel_display.c | 45 +++++++++++++++++++++++++-
> ----------
> drivers/gpu/drm/i915/intel_drv.h | 10 ++++++--
> drivers/gpu/drm/i915/intel_sprite.c | 12 +++++-----
> 3 files changed, 45 insertions(+), 22 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/intel_display.c
> b/drivers/gpu/drm/i915/intel_display.c
> index 3aec789657b1..6184053fd385 100644
> --- a/drivers/gpu/drm/i915/intel_display.c
> +++ b/drivers/gpu/drm/i915/intel_display.c
> @@ -2202,7 +2202,7 @@ u32 intel_fb_xy_to_linear(int x, int y,
> {
> const struct drm_framebuffer *fb = state->base.fb;
> unsigned int cpp = fb->format->cpp[plane];
> - unsigned int pitch = fb->pitches[plane];
> + unsigned int pitch = state->color_plane[plane].stride;
>
> return y * pitch + x * cpp;
> }
> @@ -2259,11 +2259,11 @@ static u32 intel_adjust_tile_offset(int *x,
> int *y,
> static u32 intel_adjust_aligned_offset(int *x, int *y,
> const struct drm_framebuffer
> *fb, int plane,
> unsigned int rotation,
> + unsigned int pitch,
> u32 old_offset, u32 new_offset)
> {
> struct drm_i915_private *dev_priv = to_i915(fb->dev);
> unsigned int cpp = fb->format->cpp[plane];
> - unsigned int pitch = intel_fb_pitch(fb, plane, rotation);
>
> WARN_ON(new_offset > old_offset);
>
> @@ -2305,6 +2305,7 @@ static u32
> intel_plane_adjust_aligned_offset(int *x, int *y,
> {
> return intel_adjust_aligned_offset(x, y, state->base.fb, plane,
> state->base.rotation,
> + state-
> >color_plane[plane].stride,
> old_offset, new_offset);
> }
>
> @@ -2381,7 +2382,7 @@ static u32
> intel_plane_compute_aligned_offset(int *x, int *y,
> struct drm_i915_private *dev_priv = to_i915(intel_plane-
> >base.dev);
> const struct drm_framebuffer *fb = state->base.fb;
> unsigned int rotation = state->base.rotation;
> - int pitch = intel_fb_pitch(fb, plane, rotation);
> + int pitch = state->color_plane[plane].stride;
> u32 alignment;
>
> if (intel_plane->id == PLANE_CURSOR)
> @@ -2408,6 +2409,7 @@ static int intel_fb_offset_to_xy(int *x, int
> *y,
>
> intel_adjust_aligned_offset(x, y,
> fb, plane, DRM_MODE_ROTATE_0,
> + fb->pitches[0],
> fb->offsets[plane], 0);
>
> return 0;
> @@ -2849,6 +2851,9 @@ intel_find_initial_plane_obj(struct intel_crtc
> *intel_crtc,
> return;
>
> valid_fb:
> + intel_state->color_plane[0].stride =
> + intel_fb_pitch(fb, 0, intel_state->base.rotation);
> +
> mutex_lock(&dev->struct_mutex);
> intel_state->vma =
> intel_pin_and_fence_fb_obj(fb,
> @@ -3166,6 +3171,9 @@ int skl_check_plane_surface(const struct
> intel_crtc_state *crtc_state,
> unsigned int rotation = plane_state->base.rotation;
> int ret;
>
> + plane_state->color_plane[0].stride = intel_fb_pitch(fb, 0,
> rotation);
> + plane_state->color_plane[1].stride = intel_fb_pitch(fb, 1,
> rotation);
> +
> if (rotation & DRM_MODE_REFLECT_X &&
> fb->modifier == DRM_FORMAT_MOD_LINEAR) {
> DRM_DEBUG_KMS("horizontal flip is not supported with
> linear surface formats\n");
> @@ -3301,10 +3309,14 @@ int i9xx_check_plane_surface(struct
> intel_plane_state *plane_state)
> {
> struct drm_i915_private *dev_priv =
> to_i915(plane_state->base.plane->dev);
> + const struct drm_framebuffer *fb = plane_state->base.fb;
> + unsigned int rotation = plane_state->base.rotation;
> int src_x = plane_state->base.src.x1 >> 16;
> int src_y = plane_state->base.src.y1 >> 16;
> u32 offset;
>
> + plane_state->color_plane[0].stride = intel_fb_pitch(fb, 0,
> rotation);
> +
> intel_add_fb_offsets(&src_x, &src_y, plane_state, 0);
>
> if (INTEL_GEN(dev_priv) >= 4)
> @@ -3315,7 +3327,6 @@ int i9xx_check_plane_surface(struct
> intel_plane_state *plane_state)
>
> /* HSW/BDW do this automagically in hardware */
> if (!IS_HASWELL(dev_priv) && !IS_BROADWELL(dev_priv)) {
> - unsigned int rotation = plane_state->base.rotation;
> int src_w = drm_rect_width(&plane_state->base.src) >>
> 16;
> int src_h = drm_rect_height(&plane_state->base.src) >>
> 16;
>
> @@ -3339,7 +3350,6 @@ static void i9xx_update_plane(struct
> intel_plane *plane,
> const struct intel_plane_state
> *plane_state)
> {
> struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
> - const struct drm_framebuffer *fb = plane_state->base.fb;
> enum i9xx_plane_id i9xx_plane = plane->i9xx_plane;
> u32 linear_offset;
> u32 dspcntr = plane_state->ctl;
> @@ -3376,7 +3386,7 @@ static void i9xx_update_plane(struct
> intel_plane *plane,
>
> I915_WRITE_FW(reg, dspcntr);
>
> - I915_WRITE_FW(DSPSTRIDE(i9xx_plane), fb->pitches[0]);
> + I915_WRITE_FW(DSPSTRIDE(i9xx_plane), plane_state-
> >color_plane[0].stride);
> if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv)) {
> I915_WRITE_FW(DSPSURF(i9xx_plane),
> intel_plane_ggtt_offset(plane_state) +
> @@ -3486,16 +3496,16 @@ static void skl_detach_scalers(struct
> intel_crtc *intel_crtc)
> }
> }
>
> -u32 skl_plane_stride(const struct drm_framebuffer *fb, int plane,
> - unsigned int rotation)
> +u32 skl_plane_stride(const struct intel_plane_state *plane_state,
> + int plane)
> {
> - u32 stride;
> + const struct drm_framebuffer *fb = plane_state->base.fb;
> + unsigned int rotation = plane_state->base.rotation;
> + u32 stride = plane_state->color_plane[plane].stride;
>
> if (plane >= fb->format->num_planes)
> return 0;
>
> - stride = intel_fb_pitch(fb, plane, rotation);
> -
> /*
> * The stride is either expressed as a multiple of 64 bytes
> chunks for
> * linear buffers or in number of tiles for tiled buffers.
> @@ -9660,6 +9670,7 @@ static int intel_check_cursor(struct
> intel_crtc_state *crtc_state,
> struct intel_plane_state *plane_state)
> {
> const struct drm_framebuffer *fb = plane_state->base.fb;
> + unsigned int rotation = plane_state->base.rotation;
> int src_x, src_y;
> u32 offset;
> int ret;
> @@ -9680,6 +9691,8 @@ static int intel_check_cursor(struct
> intel_crtc_state *crtc_state,
> return -EINVAL;
> }
>
> + plane_state->color_plane[0].stride = intel_fb_pitch(fb, 0,
> rotation);
> +
> src_x = plane_state->base.src_x >> 16;
> src_y = plane_state->base.src_y >> 16;
>
> @@ -9708,12 +9721,10 @@ i845_cursor_max_stride(struct intel_plane
> *plane,
> static u32 i845_cursor_ctl(const struct intel_crtc_state
> *crtc_state,
> const struct intel_plane_state *plane_state)
> {
> - const struct drm_framebuffer *fb = plane_state->base.fb;
> -
> return CURSOR_ENABLE |
> CURSOR_GAMMA_ENABLE |
> CURSOR_FORMAT_ARGB |
> - CURSOR_STRIDE(fb->pitches[0]);
> + CURSOR_STRIDE(plane_state->color_plane[0].stride);
> }
>
> static bool i845_cursor_size_ok(const struct intel_plane_state
> *plane_state)
> @@ -9750,6 +9761,9 @@ static int i845_check_cursor(struct intel_plane
> *plane,
> return -EINVAL;
> }
>
> + WARN_ON(plane_state->base.visible &&
> + plane_state->color_plane[0].stride != fb->pitches[0]);
> +
> switch (fb->pitches[0]) {
> case 256:
> case 512:
> @@ -9951,6 +9965,9 @@ static int i9xx_check_cursor(struct intel_plane
> *plane,
> return -EINVAL;
> }
>
> + WARN_ON(plane_state->base.visible &&
> + plane_state->color_plane[0].stride != fb->pitches[0]);
> +
> if (fb->pitches[0] != plane_state->base.crtc_w * fb->format-
> >cpp[0]) {
> DRM_DEBUG_KMS("Invalid cursor stride (%u) (cursor width
> %d)\n",
> fb->pitches[0], plane_state-
> >base.crtc_w);
> diff --git a/drivers/gpu/drm/i915/intel_drv.h
> b/drivers/gpu/drm/i915/intel_drv.h
> index 24282b855e81..f647f9e1f671 100644
> --- a/drivers/gpu/drm/i915/intel_drv.h
> +++ b/drivers/gpu/drm/i915/intel_drv.h
> @@ -500,6 +500,12 @@ struct intel_plane_state {
>
> struct {
> u32 offset;
> + /*
> + * Plane stride in:
> + * bytes for 0/180 degree rotation
> + * pixels for 90/270 degree rotation
> + */
> + u32 stride;
> int x, y;
> } color_plane[2];
>
> @@ -1645,8 +1651,8 @@ u32 glk_plane_color_ctl(const struct
> intel_crtc_state *crtc_state,
> u32 skl_plane_ctl(const struct intel_crtc_state *crtc_state,
> const struct intel_plane_state *plane_state);
> u32 glk_color_ctl(const struct intel_plane_state *plane_state);
> -u32 skl_plane_stride(const struct drm_framebuffer *fb, int plane,
> - unsigned int rotation);
> +u32 skl_plane_stride(const struct intel_plane_state *plane_state,
> + int plane);
> int skl_check_plane_surface(const struct intel_crtc_state
> *crtc_state,
> struct intel_plane_state *plane_state);
> int i9xx_check_plane_surface(struct intel_plane_state *plane_state);
> diff --git a/drivers/gpu/drm/i915/intel_sprite.c
> b/drivers/gpu/drm/i915/intel_sprite.c
> index d4b3d32d5e4a..a07d951afbf9 100644
> --- a/drivers/gpu/drm/i915/intel_sprite.c
> +++ b/drivers/gpu/drm/i915/intel_sprite.c
> @@ -257,9 +257,8 @@ skl_update_plane(struct intel_plane *plane,
> u32 plane_ctl = plane_state->ctl;
> const struct drm_intel_sprite_colorkey *key = &plane_state-
> >ckey;
> u32 surf_addr = plane_state->color_plane[0].offset;
> - unsigned int rotation = plane_state->base.rotation;
> - u32 stride = skl_plane_stride(fb, 0, rotation);
> - u32 aux_stride = skl_plane_stride(fb, 1, rotation);
> + u32 stride = skl_plane_stride(plane_state, 0);
> + u32 aux_stride = skl_plane_stride(plane_state, 1);
> int crtc_x = plane_state->base.dst.x1;
> int crtc_y = plane_state->base.dst.y1;
> uint32_t crtc_w = drm_rect_width(&plane_state->base.dst);
> @@ -590,7 +589,8 @@ vlv_update_plane(struct intel_plane *plane,
> I915_WRITE_FW(SPKEYMAXVAL(pipe, plane_id), key-
> >max_value);
> I915_WRITE_FW(SPKEYMSK(pipe, plane_id), key-
> >channel_mask);
> }
> - I915_WRITE_FW(SPSTRIDE(pipe, plane_id), fb->pitches[0]);
> + I915_WRITE_FW(SPSTRIDE(pipe, plane_id),
> + plane_state->color_plane[0].stride);
> I915_WRITE_FW(SPPOS(pipe, plane_id), (crtc_y << 16) | crtc_x);
>
> if (fb->modifier == I915_FORMAT_MOD_X_TILED)
> @@ -752,7 +752,7 @@ ivb_update_plane(struct intel_plane *plane,
> I915_WRITE_FW(SPRKEYMSK(pipe), key->channel_mask);
> }
>
> - I915_WRITE_FW(SPRSTRIDE(pipe), fb->pitches[0]);
> + I915_WRITE_FW(SPRSTRIDE(pipe), plane_state-
> >color_plane[0].stride);
> I915_WRITE_FW(SPRPOS(pipe), (crtc_y << 16) | crtc_x);
>
> /* HSW consolidates SPRTILEOFF and SPRLINOFF into a single
> SPROFFSET
> @@ -924,7 +924,7 @@ g4x_update_plane(struct intel_plane *plane,
> I915_WRITE_FW(DVSKEYMSK(pipe), key->channel_mask);
> }
>
> - I915_WRITE_FW(DVSSTRIDE(pipe), fb->pitches[0]);
> + I915_WRITE_FW(DVSSTRIDE(pipe), plane_state-
> >color_plane[0].stride);
> I915_WRITE_FW(DVSPOS(pipe), (crtc_y << 16) | crtc_x);
>
> if (fb->modifier == I915_FORMAT_MOD_X_TILED)
More information about the Intel-gfx
mailing list