Skip to contentSkip to conversation

Fixes that failed to apply to v5.0-rc5

PATCH Applied Jani Nikula 8 participants 10 messages Feb 5, 2019 – Feb 8, 2019

Subsystems (3)
lore
Share & tools
lore
#0 lore raw

The following commits have been marked as Cc: stable or fixing something in v5.0-rc5 or earlier, but failed to cherry-pick to drm-intel-fixes. Please see if they are worth backporting, and please do so if they are.

Failed to cherry-pick:
b14c06ec0249 ("drm/i915/cnl: Fix CNL macros for Voltage Swing programming") 32db0b6501d9 ("drm/i915: Don't try to use the hardware frame counter with i965gm TV output")

Cherry-pick fine but fail to build:
7bed8adcd9f8 ("drm/i915: Try to sanitize bogus DPLL state left over by broken SNB BIOSen")

BR,
Jani.

Signature · 5 lines
Jani Nikula, Intel Open Source Graphics Center
_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
#1 lore raw

PATCH 1/1 drm/i915: Try to sanitize bogus DPLL state left over by broken SNB BIOSen

From: Ville Syrjälä <[email protected]>

Certain SNB machines (eg. ASUS K53SV) seem to have a broken BIOS which misprograms the hardware badly when encountering a suitably high resolution display. The programmed pipe timings are somewhat bonkers and the DPLL is totally misprogrammed (P divider == 0). That will result in atomic commit timeouts as apparently the pipe is sufficiently stuck to not signal vblank interrupts.

IIRC something like this was also observed on some other SNB machine years ago (might have been a Dell XPS 8300) but a BIOS update cured it. Sadly looks like this was never fixed for the ASUS K53SV as the latest BIOS (K53SV.320 11/11/2011) is still broken.

The quickest way to deal with this seems to be to shut down the pipe+ports+DPLL. Unfortunately doing this during the normal sanitization phase isn't quite soon enough as we already spew several WARNs about the bogus hardware state. But it's better than hanging the boot for a few dozen seconds. Since this is limited to a few old machines it doesn't seem entirely worthwile to try and rework the readout+sanitization code to handle it more gracefully.

v2: Fix potential NULL deref (kbuild test robot)
Constify has_bogus_dpll_config()

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=109245

Fixes 516a49cc1946 ("drm/i915: Fix assert_plane() warning on bootup with external display")
(cherry picked from commit 7bed8adcd9f86231bb69bbc02f88ad89330f99e3)
---
 drivers/gpu/drm/i915/intel_display.c | 50 ++++++++++++++++++++++++----
 1 file changed, 44 insertions(+), 6 deletions(-)
drivers/gpu/drm/i915/intel_display.c +44 -6
index 3da9c0f9e948..248128126422 100644
@@ -15415,16 +15415,45 @@ static void intel_sanitize_crtc(struct intel_crtc *crtc,
 	}
 }
 
+static bool has_bogus_dpll_config(const struct intel_crtc_state *crtc_state)
+{
+	struct drm_i915_private *dev_priv = to_i915(crtc_state->base.crtc->dev);
+
+	/*
+	 * Some SNB BIOSen (eg. ASUS K53SV) are known to misprogram
+	 * the hardware when a high res displays plugged in. DPLL P
+	 * divider is zero, and the pipe timings are bonkers. We'll
+	 * try to disable everything in that case.
+	 *
+	 * FIXME would be nice to be able to sanitize this state
+	 * without several WARNs, but for now let's take the easy
+	 * road.
+	 */
+	return IS_GEN6(dev_priv) &&
+		crtc_state->base.active &&
+		crtc_state->shared_dpll &&
+		crtc_state->port_clock == 0;
+}
+
 static void intel_sanitize_encoder(struct intel_encoder *encoder)
 {
 	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
 	struct intel_connector *connector;
+	struct intel_crtc *crtc = to_intel_crtc(encoder->base.crtc);
+	struct intel_crtc_state *crtc_state = crtc ?
+		to_intel_crtc_state(crtc->base.state) : NULL;
 
 	/* We need to check both for a crtc link (meaning that the
 	 * encoder is active and trying to read from a pipe) and the
 	 * pipe itself being active. */
-	bool has_active_crtc = encoder->base.crtc &&
-		to_intel_crtc(encoder->base.crtc)->active;
+	bool has_active_crtc = crtc_state &&
+		crtc_state->base.active;
+
+	if (crtc_state && has_bogus_dpll_config(crtc_state)) {
+		DRM_DEBUG_KMS("BIOS has misprogrammed the hardware. Disabling pipe %c\n",
+			      pipe_name(crtc->pipe));
+		has_active_crtc = false;
+	}
 
 	connector = intel_encoder_find_connector(encoder);
 	if (connector && !has_active_crtc) {
@@ -15435,16 +15464,25 @@ static void intel_sanitize_encoder(struct intel_encoder *encoder)
 		/* Connector is active, but has no active pipe. This is
 		 * fallout from our resume register restoring. Disable
 		 * the encoder manually again. */
-		if (encoder->base.crtc) {
-			struct drm_crtc_state *crtc_state = encoder->base.crtc->state;
+		if (crtc_state) {
+			struct drm_encoder *best_encoder;
 
 			DRM_DEBUG_KMS("[ENCODER:%d:%s] manually disabled\n",
 				      encoder->base.base.id,
 				      encoder->base.name);
+
+			/* avoid oopsing in case the hooks consult best_encoder */
+			best_encoder = connector->base.state->best_encoder;
+			connector->base.state->best_encoder = &encoder->base;
+
 			if (encoder->disable)
-				encoder->disable(encoder, to_intel_crtc_state(crtc_state), connector->base.state);
+				encoder->disable(encoder, crtc_state,
+						 connector->base.state);
 			if (encoder->post_disable)
-				encoder->post_disable(encoder, to_intel_crtc_state(crtc_state), connector->base.state);
+				encoder->post_disable(encoder, crtc_state,
+						      connector->base.state);
+
+			connector->base.state->best_encoder = best_encoder;
 		}
 		encoder->base.crtc = NULL;
 
Signature · 6 lines
2.19.2

_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
maintainer Applied
#2 lore raw

Re: [Intel-gfx] [PATCH -fixes] drm/i915: Try to sanitize bogus DPLL state left over by broken SNB BIOSen

Quoted 31 lines · Ville Syrjala

From: Ville Syrjälä <[email protected]>

Certain SNB machines (eg. ASUS K53SV) seem to have a broken BIOS which misprograms the hardware badly when encountering a suitably high resolution display. The programmed pipe timings are somewhat bonkers and the DPLL is totally misprogrammed (P divider == 0). That will result in atomic commit timeouts as apparently the pipe is sufficiently stuck to not signal vblank interrupts.

IIRC something like this was also observed on some other SNB machine years ago (might have been a Dell XPS 8300) but a BIOS update cured it. Sadly looks like this was never fixed for the ASUS K53SV as the latest BIOS (K53SV.320 11/11/2011) is still broken.

The quickest way to deal with this seems to be to shut down the pipe+ports+DPLL. Unfortunately doing this during the normal sanitization phase isn't quite soon enough as we already spew several WARNs about the bogus hardware state. But it's better than hanging the boot for a few dozen seconds. Since this is limited to a few old machines it doesn't seem entirely worthwile to try and rework the readout+sanitization code to handle it more gracefully.

v2: Fix potential NULL deref (kbuild test robot)
Constify has_bogus_dpll_config()

Quoted 6 lines

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=109245

Fixes 516a49cc1946 ("drm/i915: Fix assert_plane() warning on bootup with external display")
(cherry picked from commit 7bed8adcd9f86231bb69bbc02f88ad89330f99e3)

Pushed to drm-intel-fixes, thanks.

BR,
Jani.

Quoted 85 lines
---
 drivers/gpu/drm/i915/intel_display.c | 50 ++++++++++++++++++++++++----
 1 file changed, 44 insertions(+), 6 deletions(-)
drivers/gpu/drm/i915/intel_display.c +44 -6
index 3da9c0f9e948..248128126422 100644
@@ -15415,16 +15415,45 @@ static void intel_sanitize_crtc(struct intel_crtc *crtc,
 	}
 }
 
+static bool has_bogus_dpll_config(const struct intel_crtc_state *crtc_state)
+{
+	struct drm_i915_private *dev_priv = to_i915(crtc_state->base.crtc->dev);
+
+	/*
+	 * Some SNB BIOSen (eg. ASUS K53SV) are known to misprogram
+	 * the hardware when a high res displays plugged in. DPLL P
+	 * divider is zero, and the pipe timings are bonkers. We'll
+	 * try to disable everything in that case.
+	 *
+	 * FIXME would be nice to be able to sanitize this state
+	 * without several WARNs, but for now let's take the easy
+	 * road.
+	 */
+	return IS_GEN6(dev_priv) &&
+		crtc_state->base.active &&
+		crtc_state->shared_dpll &&
+		crtc_state->port_clock == 0;
+}
+
 static void intel_sanitize_encoder(struct intel_encoder *encoder)
 {
 	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
 	struct intel_connector *connector;
+	struct intel_crtc *crtc = to_intel_crtc(encoder->base.crtc);
+	struct intel_crtc_state *crtc_state = crtc ?
+		to_intel_crtc_state(crtc->base.state) : NULL;
 
 	/* We need to check both for a crtc link (meaning that the
 	 * encoder is active and trying to read from a pipe) and the
 	 * pipe itself being active. */
-	bool has_active_crtc = encoder->base.crtc &&
-		to_intel_crtc(encoder->base.crtc)->active;
+	bool has_active_crtc = crtc_state &&
+		crtc_state->base.active;
+
+	if (crtc_state && has_bogus_dpll_config(crtc_state)) {
+		DRM_DEBUG_KMS("BIOS has misprogrammed the hardware. Disabling pipe %c\n",
+			      pipe_name(crtc->pipe));
+		has_active_crtc = false;
+	}
 
 	connector = intel_encoder_find_connector(encoder);
 	if (connector && !has_active_crtc) {
@@ -15435,16 +15464,25 @@ static void intel_sanitize_encoder(struct intel_encoder *encoder)
 		/* Connector is active, but has no active pipe. This is
 		 * fallout from our resume register restoring. Disable
 		 * the encoder manually again. */
-		if (encoder->base.crtc) {
-			struct drm_crtc_state *crtc_state = encoder->base.crtc->state;
+		if (crtc_state) {
+			struct drm_encoder *best_encoder;
 
 			DRM_DEBUG_KMS("[ENCODER:%d:%s] manually disabled\n",
 				      encoder->base.base.id,
 				      encoder->base.name);
+
+			/* avoid oopsing in case the hooks consult best_encoder */
+			best_encoder = connector->base.state->best_encoder;
+			connector->base.state->best_encoder = &encoder->base;
+
 			if (encoder->disable)
-				encoder->disable(encoder, to_intel_crtc_state(crtc_state), connector->base.state);
+				encoder->disable(encoder, crtc_state,
+						 connector->base.state);
 			if (encoder->post_disable)
-				encoder->post_disable(encoder, to_intel_crtc_state(crtc_state), connector->base.state);
+				encoder->post_disable(encoder, crtc_state,
+						      connector->base.state);
+
+			connector->base.state->best_encoder = best_encoder;
 		}
 		encoder->base.crtc = NULL;
Signature · 1 line
Jani Nikula, Intel Open Source Graphics Center
maintainer
#3 lore raw

Re: [PATCH -fixes] drm/i915: Try to sanitize bogus DPLL state left over by broken SNB BIOSen

In reply to Ville Syrjala

Hi,

[This is an automated email]

This commit has been processed because it contains a "Fixes:" tag,
fixing commit: 516a49cc1946 drm/i915: Fix assert_plane() warning on bootup with external display.

The bot has tested the following trees: v4.20.6.

v4.20.6: Failed to apply! Possible dependencies:
c84c6fe30302 ("drm/i915: make encoder enable and disable hooks optional")

How should we proceed with this patch?

--
Thanks,
Sasha
_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

#4 lore raw
In reply to Jani Nikula
Quoted 8 lines · Jani Nikula

The following commits have been marked as Cc: stable or fixing something in v5.0-rc5 or earlier, but failed to cherry-pick to drm-intel-fixes. Please see if they are worth backporting, and please do so if they are.

Failed to cherry-pick:
32db0b6501d9 ("drm/i915: Don't try to use the hardware frame counter with i965gm TV output")

This one depends on d20151a7699 ("drm/vblank: Allow dynamic per-crtc max_vblank_count") which I seem to have pushed to drm-misc-next.

Is it OK if we just cherry-pick that into drm-intel-fixes? Dave / Daniel?

Signature · 6 lines
Ville Syrjälä
Intel
_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
#5 lore raw
Quoted 7 lines · Ville Syrjälä
Quoted 6 lines · Jani Nikula

The following commits have been marked as Cc: stable or fixing something in v5.0-rc5 or earlier, but failed to cherry-pick to drm-intel-fixes. Please see if they are worth backporting, and please do so if they are.

Quoted 7 lines
Quoted 2 lines

Failed to cherry-pick:
32db0b6501d9 ("drm/i915: Don't try to use the hardware frame counter with i965gm TV output")

This one depends on d20151a7699 ("drm/vblank: Allow dynamic per-crtc max_vblank_count") which I seem to have pushed to drm-misc-next.

Is it OK if we just cherry-pick that into drm-intel-fixes? Dave / Daniel?

Ping. Also Cc: drm-misc maintainers.

BR,
Jani.

Signature · 5 lines
Jani Nikula, Intel Open Source Graphics Center
_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
#6 lore raw
Quoted 8 lines · Jani Nikula
Quoted 7 lines · Ville Syrjälä
Quoted 6 lines · Jani Nikula

The following commits have been marked as Cc: stable or fixing something in v5.0-rc5 or earlier, but failed to cherry-pick to drm-intel-fixes. Please see if they are worth backporting, and please do so if they are.

Quoted 4 lines
Quoted 4 lines
Quoted 2 lines

Failed to cherry-pick:
32db0b6501d9 ("drm/i915: Don't try to use the hardware frame counter with i965gm TV output")

This one depends on d20151a7699 ("drm/vblank: Allow dynamic per-crtc

*ed20151a7699

Is it being used in -misc-next right now? If not, perhaps revert there and apply to -intel-fixes? It doesn't look like it's landed in stable either.

....or just cherry-pick and make sure everything drops out nicely :)

Sean

Quoted 12 lines
Quoted 3 lines

max_vblank_count") which I seem to have pushed to drm-misc-next.

Is it OK if we just cherry-pick that into drm-intel-fixes? Dave / Daniel?

Ping. Also Cc: drm-misc maintainers.

BR,
Jani.

Signature · 1 line
Jani Nikula, Intel Open Source Graphics Center
Signature · 5 lines
Sean Paul, Software Engineer, Google / Chromium OS
_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
#7 lore raw

✗ Fi.CI.BAT: failure for drm/i915: Try to sanitize bogus DPLL state left over by broken SNB BIOSen (rev3)

In reply to Jani Nikula
== Series Details ==

== Series Details ==

Series: drm/i915: Try to sanitize bogus DPLL state left over by broken SNB BIOSen (rev3)
URL : https://patchwork.freedesktop.org/series/54942/
State : failure

== Summary ==

Applying: drm/i915: Try to sanitize bogus DPLL state left over by broken SNB BIOSen Using index info to reconstruct a base tree...
M drivers/gpu/drm/i915/intel_display.c
Falling back to patching base and 3-way merge...
Auto-merging drivers/gpu/drm/i915/intel_display.c
CONFLICT (content): Merge conflict in drivers/gpu/drm/i915/intel_display.c
error: Failed to merge in the changes.
hint: Use 'git am --show-current-patch' to see the failed patch
Patch failed at 0001 drm/i915: Try to sanitize bogus DPLL state left over by broken SNB BIOSen When you have resolved this problem, run "git am --continue".
If you prefer to skip this patch, run "git am --skip" instead.
To restore the original branch and stop patching, run "git am --abort".

_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

#8 lore raw
In reply to Jani Nikula
Quoted 8 lines · Jani Nikula

The following commits have been marked as Cc: stable or fixing something in v5.0-rc5 or earlier, but failed to cherry-pick to drm-intel-fixes. Please see if they are worth backporting, and please do so if they are.

Failed to cherry-pick:
b14c06ec0249 ("drm/i915/cnl: Fix CNL macros for Voltage Swing programming")

b14c06ec0249 is dependent on
265a2a6255f5 drm/i915/icl: combo port vswing programming changes per BSPEC
https://patchwork.freedesktop.org/patch/268514/

How should I go about the backport to drm-intel-fixes?

Quoted 11 lines

32db0b6501d9 ("drm/i915: Don't try to use the hardware frame counter with i965gm TV output")

Cherry-pick fine but fail to build:
7bed8adcd9f8 ("drm/i915: Try to sanitize bogus DPLL state left over by broken SNB BIOSen")

BR,
Jani.

Signature · 1 line
Jani Nikula, Intel Open Source Graphics Center

Regards,
Aditya Swarup
_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

maintainer
#9 lore raw
Quoted 11 lines · Aditya Swarup
Quoted 8 lines · Jani Nikula

The following commits have been marked as Cc: stable or fixing something in v5.0-rc5 or earlier, but failed to cherry-pick to drm-intel-fixes. Please see if they are worth backporting, and please do so if they are.

Failed to cherry-pick:
b14c06ec0249 ("drm/i915/cnl: Fix CNL macros for Voltage Swing programming")

b14c06ec0249 is dependent on
265a2a6255f5 drm/i915/icl: combo port vswing programming changes per BSPEC

It is actually b265a2a6255f5
b265a2a6255f ("drm/i915/icl: combo port vswing programming changes per BSPEC")

Quoted 3 lines

https://patchwork.freedesktop.org/patch/268514/

How should I go about the backport to drm-intel-fixes?

Nothing. Well, you already did by providing the dependency ;)

Jani could cherry-pick both because
both applies cleanly on drm-intel-fixes

Quoted 10 lines
Quoted 10 lines

32db0b6501d9 ("drm/i915: Don't try to use the hardware frame counter with i965gm TV output")

Cherry-pick fine but fail to build:
7bed8adcd9f8 ("drm/i915: Try to sanitize bogus DPLL state left over by broken SNB BIOSen")

BR,
Jani.

Quoted 5 lines
Quoted 2 lines
Signature · 1 line
Jani Nikula, Intel Open Source Graphics Center

Regards,
Aditya Swarup

_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx