FAILED: patch "[PATCH] drm/i915: Workaround broken BIOS DBUF configuration on" failed to apply to 5.15-stable tree
[email protected]
maintainerThe patch below does not apply to the 5.15-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 4e6f55120c7eccf6f9323bb681632e23cbcb3f3c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ville=20Syrj=C3=A4l=C3=A4?= <[email protected]>
Date: Fri, 4 Feb 2022 16:18:18 +0200
Subject: [PATCH] drm/i915: Workaround broken BIOS DBUF configuration on
TGL/RKL
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
On TGL/RKL the BIOS likes to use some kind of bogus DBUF layout that doesn't match what the spec recommends. With a single active pipe that is not going to be a problem, but with multiple pipes active skl_commit_modeset_enables() goes into an infinite loop since it can't figure out any order in which it can commit the pipes without causing DBUF overlaps between the planes.
We'd need some kind of extra DBUF defrag stage in between to make the transition possible. But that is clearly way too complex a solution, so in the name of simplicity let's just sanitize the DBUF state by simply turning off all planes when we detect a pipe encroaching on its neighbours' DBUF slices. We only have to disable the primary planes as all other planes should have already been disabled (if they somehow were enabled) by earlier sanitization steps.
And for good measure let's also sanitize in case the DBUF allocations of the pipes already seem to overlap each other.
drivers/gpu/drm/i915/display/intel_display.c +1 -0
@@ -10673,6 +10673,7 @@ intel_modeset_setup_hw_state(struct drm_device *dev,vlv_wm_sanitize (dev_priv); }else if (DISPLAY_VER (dev_priv) >=9 ) {skl_wm_get_hw_state (dev_priv); +skl_wm_sanitize (dev_priv); }else if (HAS_PCH_SPLIT (dev_priv)) {ilk_wm_get_hw_state (dev_priv); }
drivers/gpu/drm/i915/intel_pm.c +68 -0
74 lines not on this page · raw message
drivers/gpu/drm/i915/intel_pm.h +1 -0
@@ -47,6 +47,7 @@ void skl_pipe_wm_get_hw_state(struct intel_crtc *crtc, struct skl_pipe_wm *out);void g4x_wm_sanitize (struct drm_i915_private *dev_priv);void vlv_wm_sanitize (struct drm_i915_private *dev_priv); +void skl_wm_sanitize (struct drm_i915_private *dev_priv);bool intel_can_enable_sagv (struct drm_i915_private *dev_priv,const struct intel_bw_state *bw_state);void intel_sagv_pre_plane_update (struct intel_atomic_state *state);
PATCH 1/1 drm/i915: Workaround broken BIOS DBUF configuration on TGL/RKL
From: Ville Syrjälä <[email protected]>
commit 4e6f55120c7eccf6f9323bb681632e23cbcb3f3c upstream.
On TGL/RKL the BIOS likes to use some kind of bogus DBUF layout that doesn't match what the spec recommends. With a single active pipe that is not going to be a problem, but with multiple pipes active skl_commit_modeset_enables() goes into an infinite loop since it can't figure out any order in which it can commit the pipes without causing DBUF overlaps between the planes.
We'd need some kind of extra DBUF defrag stage in between to make the transition possible. But that is clearly way too complex a solution, so in the name of simplicity let's just sanitize the DBUF state by simply turning off all planes when we detect a pipe encroaching on its neighbours' DBUF slices. We only have to disable the primary planes as all other planes should have already been disabled (if they somehow were enabled) by earlier sanitization steps.
And for good measure let's also sanitize in case the DBUF allocations of the pipes already seem to overlap each other.
---
The chain of additional cherry-picks needed to get intel_plane_disable_noatomic() destaticed looked pretty hairy, so I just fixed it up manually.
drivers/gpu/drm/i915/display/intel_display.c | 5 +- drivers/gpu/drm/i915/display/intel_display.h | 2 + drivers/gpu/drm/i915/intel_pm.c | 68 ++++++++++++++++++++ drivers/gpu/drm/i915/intel_pm.h | 1 + 4 files changed, 74 insertions(+), 2 deletions(-)
drivers/gpu/drm/i915/display/intel_display.c +3 -2
@@ -1833,8 +1833,8 @@ static void fixup_plane_bitmasks(struct intel_crtc_state *crtc_state) } } -static void intel_plane_disable_noatomic (struct intel_crtc *crtc, -struct intel_plane *plane) +void intel_plane_disable_noatomic (struct intel_crtc *crtc, +struct intel_plane *plane) {struct drm_i915_private *dev_priv =to_i915 (crtc->base.dev); struct intel_crtc_state *crtc_state =
@@ -13435,6 +13435,7 @@ intel_modeset_setup_hw_state(struct drm_device *dev,vlv_wm_sanitize (dev_priv); }else if (DISPLAY_VER (dev_priv) >=9 ) {skl_wm_get_hw_state (dev_priv); +skl_wm_sanitize (dev_priv); }else if (HAS_PCH_SPLIT (dev_priv)) {ilk_wm_get_hw_state (dev_priv); }
drivers/gpu/drm/i915/display/intel_display.h +2 -0
@@ -629,6 +629,8 @@ void intel_plane_unpin_fb(struct intel_plane_state *old_plane_state);struct intel_encoder *intel_get_crtc_new_encoder (const struct intel_atomic_state *state,const struct intel_crtc_state *crtc_state); +void intel_plane_disable_noatomic (struct intel_crtc *crtc, +struct intel_plane *plane);unsigned int intel_surf_alignment (const struct drm_framebuffer *fb,int color_plane);
drivers/gpu/drm/i915/intel_pm.c +68 -0
74 lines not on this page · raw message
drivers/gpu/drm/i915/intel_pm.h +1 -0
@@ -48,6 +48,7 @@ void skl_pipe_wm_get_hw_state(struct intel_crtc *crtc, struct skl_pipe_wm *out);void g4x_wm_sanitize (struct drm_i915_private *dev_priv);void vlv_wm_sanitize (struct drm_i915_private *dev_priv); +void skl_wm_sanitize (struct drm_i915_private *dev_priv);bool intel_can_enable_sagv (struct drm_i915_private *dev_priv,const struct intel_bw_state *bw_state);void intel_sagv_pre_plane_update (struct intel_atomic_state *state);
Signature · 1 line
2.34.1
Greg KH
maintainerRe: [PATCH stable-5.15] drm/i915: Workaround broken BIOS DBUF configuration on TGL/RKL
Quoted 31 lines · Ville Syrjala
From: Ville Syrjälä <[email protected]>
commit
4e6f55120c7eccf6f9323bb681632e23cbcb3f3cupstream.On TGL/RKL the BIOS likes to use some kind of bogus DBUF layout that doesn't match what the spec recommends. With a single active pipe that is not going to be a problem, but with multiple pipes active
skl_commit_modeset_enables()goes into an infinite loop since it can't figure out any order in which it can commit the pipes without causing DBUF overlaps between the planes.We'd need some kind of extra DBUF defrag stage in between to make the transition possible. But that is clearly way too complex a solution, so in the name of simplicity let's just sanitize the DBUF state by simply turning off all planes when we detect a pipe encroaching on its neighbours' DBUF slices. We only have to disable the primary planes as all other planes should have already been disabled (if they somehow were enabled) by earlier sanitization steps.
And for good measure let's also sanitize in case the DBUF allocations of the pipes already seem to overlap each other.
Cc <[email protected]> # v5.14+Signed-off-by Ville Syrjälä <[email protected]>Reviewed-by Stanislav Lisovskiy <[email protected]>(cherry picked from commit 15512021eb3975a8c2366e3883337e252bb0eee5)Signed-off-by Tvrtko Ursulin <[email protected]>(cherry picked from commit 4e6f55120c7eccf6f9323bb681632e23cbcb3f3c)
Quoted 4 lines
---
The chain of additional cherry-picks needed to getintel_plane_disable_noatomic()destaticed looked pretty hairy, so I just fixed it up manually.
Now queued up, thanks.
greg k-h