Skip to content

Commit 9504a89

Browse files
Lyudedanvet
authored andcommitted
drm/i915/vlv: Reset the ADPA in vlv_display_power_well_init()
While VGA hotplugging worked(ish) before, it looks like that was mainly because we'd unintentionally enable it in valleyview_crt_detect_hotplug() when we did a force trigger. This doesn't work reliably enough because whenever the display powerwell on vlv gets disabled, the values set in VLV_ADPA get cleared and consequently VGA hotplugging gets disabled. This causes bugs such as one we found on an Intel NUC, where doing the following sequence of hotplugs: - Disconnect all monitors - Connect VGA - Disconnect VGA - Connect HDMI Would result in VGA hotplugging becoming disabled, due to the powerwells getting toggled in the process of connecting HDMI. Changes since v3: - Expose intel_crt_reset() through intel_drv.h and call that in vlv_display_power_well_init() instead of encoder->base.funcs->reset(&encoder->base); Changes since v2: - Use intel_encoder structs instead of drm_encoder structs Changes since v1: - Instead of handling the register writes ourself, we just reuse intel_crt_detect() - Instead of resetting the ADPA during display IRQ installation, we now reset them in vlv_display_power_well_init() Cc: stable@vger.kernel.org Acked-by: Daniel Vetter <daniel.vetter@ffwll.ch> Signed-off-by: Lyude <cpaul@redhat.com> Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com> [danvet: Rebase over dev_priv/drm_device embedding.] Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
1 parent 28cf71c commit 9504a89

File tree

3 files changed

+9
-2
lines changed

3 files changed

+9
-2
lines changed

drivers/gpu/drm/i915/intel_crt.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -717,7 +717,7 @@ static int intel_crt_set_property(struct drm_connector *connector,
717717
return 0;
718718
}
719719

720-
static void intel_crt_reset(struct drm_encoder *encoder)
720+
void intel_crt_reset(struct drm_encoder *encoder)
721721
{
722722
struct drm_device *dev = encoder->dev;
723723
struct drm_i915_private *dev_priv = to_i915(dev);

drivers/gpu/drm/i915/intel_drv.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1102,7 +1102,7 @@ void gen8_irq_power_well_pre_disable(struct drm_i915_private *dev_priv,
11021102

11031103
/* intel_crt.c */
11041104
void intel_crt_init(struct drm_device *dev);
1105-
1105+
void intel_crt_reset(struct drm_encoder *encoder);
11061106

11071107
/* intel_ddi.c */
11081108
void intel_ddi_clk_select(struct intel_encoder *encoder,

drivers/gpu/drm/i915/intel_runtime_pm.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1078,6 +1078,7 @@ static void vlv_init_display_clock_gating(struct drm_i915_private *dev_priv)
10781078

10791079
static void vlv_display_power_well_init(struct drm_i915_private *dev_priv)
10801080
{
1081+
struct intel_encoder *encoder;
10811082
enum pipe pipe;
10821083

10831084
/*
@@ -1113,6 +1114,12 @@ static void vlv_display_power_well_init(struct drm_i915_private *dev_priv)
11131114

11141115
intel_hpd_init(dev_priv);
11151116

1117+
/* Re-enable the ADPA, if we have one */
1118+
for_each_intel_encoder(&dev_priv->drm, encoder) {
1119+
if (encoder->type == INTEL_OUTPUT_ANALOG)
1120+
intel_crt_reset(&encoder->base);
1121+
}
1122+
11161123
i915_redisable_vga_power_on(&dev_priv->drm);
11171124
}
11181125

0 commit comments

Comments
 (0)