On Fri, Feb 04, 2022 at 04:18:17PM +0200, Ville Syrjala wrote:
> From: Ville Syrjälä <[email protected]>
> 
> During readout we cannot assume the planes are actually using the
> slices they are supposed to use. The BIOS may have misprogrammed
> things and put the planes onto the wrong dbuf slices. So let's
> do the readout more carefully to make sure we really know which
> dbuf slices are actually in use by the pipe at the time.

We have actually already bugs, related to this.

Reviewed-by: Stanislav Lisovskiy <[email protected]>

> 
> Signed-off-by: Ville Syrjälä <[email protected]>
> ---
>  drivers/gpu/drm/i915/intel_pm.c | 13 ++++++++-----
>  1 file changed, 8 insertions(+), 5 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
> index 2eb70ec38f6e..79d61a2935ea 100644
> --- a/drivers/gpu/drm/i915/intel_pm.c
> +++ b/drivers/gpu/drm/i915/intel_pm.c
> @@ -6663,6 +6663,7 @@ void skl_wm_get_hw_state(struct drm_i915_private 
> *dev_priv)
>               enum pipe pipe = crtc->pipe;
>               unsigned int mbus_offset;
>               enum plane_id plane_id;
> +             u8 slices;
>  
>               skl_pipe_wm_get_hw_state(crtc, &crtc_state->wm.skl.optimal);
>               crtc_state->wm.skl.raw = crtc_state->wm.skl.optimal;
> @@ -6682,20 +6683,22 @@ void skl_wm_get_hw_state(struct drm_i915_private 
> *dev_priv)
>                       skl_ddb_entry_union(&dbuf_state->ddb[pipe], ddb_uv);
>               }
>  
> -             dbuf_state->slices[pipe] =
> -                     skl_compute_dbuf_slices(crtc, dbuf_state->active_pipes,
> -                                             dbuf_state->joined_mbus);
> -
>               dbuf_state->weight[pipe] = intel_crtc_ddb_weight(crtc_state);
>  
>               /*
>                * Used for checking overlaps, so we need absolute
>                * offsets instead of MBUS relative offsets.
>                */
> -             mbus_offset = mbus_ddb_offset(dev_priv, 
> dbuf_state->slices[pipe]);
> +             slices = skl_compute_dbuf_slices(crtc, dbuf_state->active_pipes,
> +                                              dbuf_state->joined_mbus);
> +             mbus_offset = mbus_ddb_offset(dev_priv, slices);
>               crtc_state->wm.skl.ddb.start = mbus_offset + 
> dbuf_state->ddb[pipe].start;
>               crtc_state->wm.skl.ddb.end = mbus_offset + 
> dbuf_state->ddb[pipe].end;
>  
> +             /* The slices actually used by the planes on the pipe */
> +             dbuf_state->slices[pipe] =
> +                     skl_ddb_dbuf_slice_mask(dev_priv, 
> &crtc_state->wm.skl.ddb);
> +
>               drm_dbg_kms(&dev_priv->drm,
>                           "[CRTC:%d:%s] dbuf slices 0x%x, ddb (%d - %d), 
> active pipes 0x%x, mbus joined: %s\n",
>                           crtc->base.base.id, crtc->base.name,
> -- 
> 2.34.1
> 

Reply via email to