[Intel-gfx] [PATCH 2/3] drm/i915: Populate pipe dbuf slices more accurately during readout
Lisovskiy, Stanislav
stanislav.lisovskiy at intel.com
Mon Feb 7 07:30:27 UTC 2022
On Fri, Feb 04, 2022 at 04:18:17PM +0200, Ville Syrjala wrote:
> From: Ville Syrjälä <ville.syrjala at linux.intel.com>
>
> 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 <stanislav.lisovskiy at intel.com>
>
> Signed-off-by: Ville Syrjälä <ville.syrjala at linux.intel.com>
> ---
> 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
>
More information about the Intel-gfx
mailing list