[Intel-gfx] [PATCH] drm/i915/skl: Use proper plane dimensions for DDB and WM calculations
Ville Syrjälä
ville.syrjala at linux.intel.com
Tue Jan 12 04:07:33 PST 2016
On Mon, Jan 11, 2016 at 02:13:06PM -0800, Matt Roper wrote:
> On Mon, Jan 11, 2016 at 09:31:03PM +0200, Ville Syrjälä wrote:
> > On Mon, Dec 21, 2015 at 07:31:17AM -0800, Matt Roper wrote:
> > > In commit
> > >
> > > commit 024c9045221fe45482863c47c4b4c47d37f97cbf
> > > Author: Matt Roper <matthew.d.roper at intel.com>
> > > Date: Thu Sep 24 15:53:11 2015 -0700
> > >
> > > drm/i915/skl: Eliminate usage of pipe_wm_parameters from SKL-style WM (v4)
> > >
> > > I fumbled while converting the dimensions stored in the plane_parameters
> > > structure to the values stored in plane state and accidentally replaced
> > > the plane dimensions with the pipe dimensions in both the DDB allocation
> > > function and the WM calculation function. On the DDB side this is
> > > harmless since we effectively treat all of our non-cursor planes as
> > > full-screen which may not be optimal, but generally won't cause any
> > > problems either (and in 99% of the cases where there's no sprite plane
> > > usage or primary plane windowing, there's no effect at all). On the WM
> > > calculation side there's more potential for this fumble to cause actual
> > > problems since cursors also get miscalculated.
> > >
> > > Cc: Ville Syrjälä <ville.syrjala at intel.com>
> > > Cc: "Kondapally, Kalyan" <kalyan.kondapally at intel.com>
> > > Cc: Radhakrishna Sripada <radhakrishna.sripada at intel.com>
> > > Signed-off-by: Matt Roper <matthew.d.roper at intel.com>
> > > ---
> > > drivers/gpu/drm/i915/intel_pm.c | 24 +++++++++++++-----------
> > > 1 file changed, 13 insertions(+), 11 deletions(-)
> > >
> > > diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
> > > index 8d0d6f5..f4d4cc7 100644
> > > --- a/drivers/gpu/drm/i915/intel_pm.c
> > > +++ b/drivers/gpu/drm/i915/intel_pm.c
> > > @@ -2845,25 +2845,22 @@ skl_plane_relative_data_rate(const struct intel_crtc_state *cstate,
> > > const struct drm_plane_state *pstate,
> > > int y)
> > > {
> > > - struct intel_crtc *intel_crtc = to_intel_crtc(cstate->base.crtc);
> > > + struct intel_plane_state *intel_pstate = to_intel_plane_state(pstate);
> > > struct drm_framebuffer *fb = pstate->fb;
> > > + unsigned w = drm_rect_width(&intel_pstate->dst);
> > > + unsigned h = drm_rect_height(&intel_pstate->dst);
> >
> > I think you're supposed to use the src dimensions in most places.
>
> Hmm, just went back to double check the bpsec and if I'm interpreting it
> correctly, it looks like we actually need to use the larger of the two:
> "Down scaling effectively increases the pixel rate. Up scaling does not
> reduce the pixel rate."
The pixel rate is "downscale factor * pixel clock"
>
> Thanks for pointing that out; I'll send an updated patch.
>
>
>
> Matt
>
> >
> > >
> > > /* for planar format */
> > > if (fb->pixel_format == DRM_FORMAT_NV12) {
> > > if (y) /* y-plane data rate */
> > > - return intel_crtc->config->pipe_src_w *
> > > - intel_crtc->config->pipe_src_h *
> > > - drm_format_plane_cpp(fb->pixel_format, 0);
> > > + return w * h * drm_format_plane_cpp(fb->pixel_format, 0);
> > > else /* uv-plane data rate */
> > > - return (intel_crtc->config->pipe_src_w/2) *
> > > - (intel_crtc->config->pipe_src_h/2) *
> > > + return (w/2) * (h/2) *
> > > drm_format_plane_cpp(fb->pixel_format, 1);
> > > }
> > >
> > > /* for packed formats */
> > > - return intel_crtc->config->pipe_src_w *
> > > - intel_crtc->config->pipe_src_h *
> > > - drm_format_plane_cpp(fb->pixel_format, 0);
> > > + return w * h * drm_format_plane_cpp(fb->pixel_format, 0);
> > > }
> > >
> > > /*
> > > @@ -2960,6 +2957,8 @@ skl_allocate_pipe_ddb(struct intel_crtc_state *cstate,
> > > * FIXME: we may not allocate every single block here.
> > > */
> > > total_data_rate = skl_get_total_relative_data_rate(cstate);
> > > + if (!total_data_rate)
> > > + return;
> > >
> > > start = alloc->start;
> > > for_each_intel_plane_on_crtc(dev, intel_crtc, intel_plane) {
> > > @@ -3093,12 +3092,15 @@ static bool skl_compute_plane_wm(const struct drm_i915_private *dev_priv,
> > > {
> > > struct drm_plane *plane = &intel_plane->base;
> > > struct drm_framebuffer *fb = plane->state->fb;
> > > + struct intel_plane_state *intel_pstate =
> > > + to_intel_plane_state(plane->state);
> > > uint32_t latency = dev_priv->wm.skl_latency[level];
> > > uint32_t method1, method2;
> > > uint32_t plane_bytes_per_line, plane_blocks_per_line;
> > > uint32_t res_blocks, res_lines;
> > > uint32_t selected_result;
> > > uint8_t bytes_per_pixel;
> > > + unsigned w = drm_rect_width(&intel_pstate->dst);
> > >
> > > if (latency == 0 || !cstate->base.active || !fb)
> > > return false;
> > > @@ -3109,12 +3111,12 @@ static bool skl_compute_plane_wm(const struct drm_i915_private *dev_priv,
> > > latency);
> > > method2 = skl_wm_method2(skl_pipe_pixel_rate(cstate),
> > > cstate->base.adjusted_mode.crtc_htotal,
> > > - cstate->pipe_src_w,
> > > + w,
> > > bytes_per_pixel,
> > > fb->modifier[0],
> > > latency);
> > >
> > > - plane_bytes_per_line = cstate->pipe_src_w * bytes_per_pixel;
> > > + plane_bytes_per_line = w * bytes_per_pixel;
> > > plane_blocks_per_line = DIV_ROUND_UP(plane_bytes_per_line, 512);
> > >
> > > if (fb->modifier[0] == I915_FORMAT_MOD_Y_TILED ||
> > > --
> > > 2.1.4
> > >
> > > _______________________________________________
> > > Intel-gfx mailing list
> > > Intel-gfx at lists.freedesktop.org
> > > http://lists.freedesktop.org/mailman/listinfo/intel-gfx
> >
> > --
> > Ville Syrjälä
> > Intel OTC
>
> --
> Matt Roper
> Graphics Software Engineer
> IoTG Platform Enabling & Development
> Intel Corporation
> (916) 356-2795
--
Ville Syrjälä
Intel OTC
More information about the Intel-gfx
mailing list