drm_panic draws in linear framebuffer, so it's easier to re-use the
current framebuffer, and disable tiling in the panic handler, to show
the panic screen.

Signed-off-by: Jocelyn Falempe <jfale...@redhat.com>
---
 .../drm/i915/display/skl_universal_plane.c    | 20 +++++++++++++++++++
 1 file changed, 20 insertions(+)

diff --git a/drivers/gpu/drm/i915/display/skl_universal_plane.c 
b/drivers/gpu/drm/i915/display/skl_universal_plane.c
index a0a7ed01415a5..62aa40b6e2347 100644
--- a/drivers/gpu/drm/i915/display/skl_universal_plane.c
+++ b/drivers/gpu/drm/i915/display/skl_universal_plane.c
@@ -2560,6 +2560,25 @@ static u8 skl_get_plane_caps(struct drm_i915_private 
*i915,
        return caps;
 }
 
+static void skl_disable_tiling(struct intel_plane *plane)
+{
+       u32 plane_ctl;
+       struct intel_plane_state *state = 
to_intel_plane_state(plane->base.state);
+       struct drm_i915_private *dev_priv = to_i915(plane->base.dev);
+       u32 stride = state->view.color_plane[0].scanout_stride / 64;
+
+       plane_ctl = intel_de_read(dev_priv, PLANE_CTL(plane->pipe, plane->id));
+       plane_ctl &= ~PLANE_CTL_TILED_MASK;
+
+       intel_de_write_fw(dev_priv, PLANE_STRIDE(plane->pipe, plane->id),
+                         PLANE_STRIDE_(stride));
+
+       intel_de_write_fw(dev_priv, PLANE_CTL(plane->pipe, plane->id), 
plane_ctl);
+
+       intel_de_write_fw(dev_priv, PLANE_SURF(plane->pipe, plane->id),
+                         skl_plane_surf(state, 0));
+}
+
 struct intel_plane *
 skl_universal_plane_create(struct drm_i915_private *dev_priv,
                           enum pipe pipe, enum plane_id plane_id)
@@ -2601,6 +2620,7 @@ skl_universal_plane_create(struct drm_i915_private 
*dev_priv,
                plane->max_height = skl_plane_max_height;
                plane->min_cdclk = skl_plane_min_cdclk;
        }
+       plane->disable_tiling = skl_disable_tiling;
 
        if (DISPLAY_VER(dev_priv) >= 13)
                plane->max_stride = adl_plane_max_stride;
-- 
2.47.0

Reply via email to