aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915
diff options
context:
space:
mode:
authorPaulo Zanoni <paulo.r.zanoni@intel.com>2013-06-12 16:27:25 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2013-06-28 08:14:17 -0400
commit16c255335b0ec39b4e5e976f4b260978aeed5a68 (patch)
treeb99e121cb5311f75282ee44aa34a22ee0441d9ba /drivers/gpu/drm/i915
parented92f0b239ac971edc509169ae3d6955fbe0a188 (diff)
drm/i915: propagate errors from intel_dp_init_connector
In case we detect a "ghost eDP", intel_edp_init_connector frees both the connector and encoder and then returns. On Haswell, intel_ddi_init then tries to use the freed encoder on the HDMI initialization path since the following commit: commit 21a8e6a4853b2ed39fa4c5188a710f2cf1b92026 Author: Daniel Vetter <daniel.vetter@ffwll.ch> Date: Wed Apr 10 23:28:35 2013 +0200 drm/i915: don't setup hdmi for port D edp in ddi_init So now on intel_ddi_init we check for the "ghost eDP" case and return without trying to initialize HDMI. This way we won't try to read the freed "intel_encoder" struct in the next "if" statement. Signed-off-by: Paulo Zanoni <paulo.r.zanoni@intel.com> Reviewed-by: Zoltan Nyul <zoltan.nyul@intel.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers/gpu/drm/i915')
-rw-r--r--drivers/gpu/drm/i915/intel_ddi.c3
-rw-r--r--drivers/gpu/drm/i915/intel_dp.c6
-rw-r--r--drivers/gpu/drm/i915/intel_drv.h2
3 files changed, 7 insertions, 4 deletions
diff --git a/drivers/gpu/drm/i915/intel_ddi.c b/drivers/gpu/drm/i915/intel_ddi.c
index 224ce25129ce..0f835d15c18b 100644
--- a/drivers/gpu/drm/i915/intel_ddi.c
+++ b/drivers/gpu/drm/i915/intel_ddi.c
@@ -1356,7 +1356,8 @@ void intel_ddi_init(struct drm_device *dev, enum port port)
1356 intel_encoder->cloneable = false; 1356 intel_encoder->cloneable = false;
1357 intel_encoder->hot_plug = intel_ddi_hot_plug; 1357 intel_encoder->hot_plug = intel_ddi_hot_plug;
1358 1358
1359 intel_dp_init_connector(intel_dig_port, dp_connector); 1359 if (!intel_dp_init_connector(intel_dig_port, dp_connector))
1360 return;
1360 1361
1361 if (intel_encoder->type != INTEL_OUTPUT_EDP) { 1362 if (intel_encoder->type != INTEL_OUTPUT_EDP) {
1362 hdmi_connector = kzalloc(sizeof(struct intel_connector), 1363 hdmi_connector = kzalloc(sizeof(struct intel_connector),
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
index 30514e58269b..1a429cf55291 100644
--- a/drivers/gpu/drm/i915/intel_dp.c
+++ b/drivers/gpu/drm/i915/intel_dp.c
@@ -3035,7 +3035,7 @@ static bool intel_edp_init_connector(struct intel_dp *intel_dp,
3035 return true; 3035 return true;
3036} 3036}
3037 3037
3038void 3038bool
3039intel_dp_init_connector(struct intel_digital_port *intel_dig_port, 3039intel_dp_init_connector(struct intel_digital_port *intel_dig_port,
3040 struct intel_connector *intel_connector) 3040 struct intel_connector *intel_connector)
3041{ 3041{
@@ -3147,7 +3147,7 @@ intel_dp_init_connector(struct intel_digital_port *intel_dig_port,
3147 intel_dp_i2c_init(intel_dp, intel_connector, name); 3147 intel_dp_i2c_init(intel_dp, intel_connector, name);
3148 3148
3149 if (!intel_edp_init_connector(intel_dp, intel_connector)) 3149 if (!intel_edp_init_connector(intel_dp, intel_connector))
3150 return; 3150 return false;
3151 3151
3152 intel_dp_add_properties(intel_dp, connector); 3152 intel_dp_add_properties(intel_dp, connector);
3153 3153
@@ -3159,6 +3159,8 @@ intel_dp_init_connector(struct intel_digital_port *intel_dig_port,
3159 u32 temp = I915_READ(PEG_BAND_GAP_DATA); 3159 u32 temp = I915_READ(PEG_BAND_GAP_DATA);
3160 I915_WRITE(PEG_BAND_GAP_DATA, (temp & ~0xf) | 0xd); 3160 I915_WRITE(PEG_BAND_GAP_DATA, (temp & ~0xf) | 0xd);
3161 } 3161 }
3162
3163 return true;
3162} 3164}
3163 3165
3164void 3166void
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
index ffe9d35b37b4..9ddbe3b49fef 100644
--- a/drivers/gpu/drm/i915/intel_drv.h
+++ b/drivers/gpu/drm/i915/intel_drv.h
@@ -586,7 +586,7 @@ extern void intel_lvds_init(struct drm_device *dev);
586extern bool intel_is_dual_link_lvds(struct drm_device *dev); 586extern bool intel_is_dual_link_lvds(struct drm_device *dev);
587extern void intel_dp_init(struct drm_device *dev, int output_reg, 587extern void intel_dp_init(struct drm_device *dev, int output_reg,
588 enum port port); 588 enum port port);
589extern void intel_dp_init_connector(struct intel_digital_port *intel_dig_port, 589extern bool intel_dp_init_connector(struct intel_digital_port *intel_dig_port,
590 struct intel_connector *intel_connector); 590 struct intel_connector *intel_connector);
591extern void intel_dp_init_link_config(struct intel_dp *intel_dp); 591extern void intel_dp_init_link_config(struct intel_dp *intel_dp);
592extern void intel_dp_start_link_train(struct intel_dp *intel_dp); 592extern void intel_dp_start_link_train(struct intel_dp *intel_dp);