diff options
author | Paulo Zanoni <paulo.r.zanoni@intel.com> | 2013-06-12 16:27:25 -0400 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2013-06-28 08:14:17 -0400 |
commit | 16c255335b0ec39b4e5e976f4b260978aeed5a68 (patch) | |
tree | b99e121cb5311f75282ee44aa34a22ee0441d9ba /drivers/gpu/drm/i915 | |
parent | ed92f0b239ac971edc509169ae3d6955fbe0a188 (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.c | 3 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_dp.c | 6 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_drv.h | 2 |
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 | ||
3038 | void | 3038 | bool |
3039 | intel_dp_init_connector(struct intel_digital_port *intel_dig_port, | 3039 | intel_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 | ||
3164 | void | 3166 | void |
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); | |||
586 | extern bool intel_is_dual_link_lvds(struct drm_device *dev); | 586 | extern bool intel_is_dual_link_lvds(struct drm_device *dev); |
587 | extern void intel_dp_init(struct drm_device *dev, int output_reg, | 587 | extern void intel_dp_init(struct drm_device *dev, int output_reg, |
588 | enum port port); | 588 | enum port port); |
589 | extern void intel_dp_init_connector(struct intel_digital_port *intel_dig_port, | 589 | extern bool intel_dp_init_connector(struct intel_digital_port *intel_dig_port, |
590 | struct intel_connector *intel_connector); | 590 | struct intel_connector *intel_connector); |
591 | extern void intel_dp_init_link_config(struct intel_dp *intel_dp); | 591 | extern void intel_dp_init_link_config(struct intel_dp *intel_dp); |
592 | extern void intel_dp_start_link_train(struct intel_dp *intel_dp); | 592 | extern void intel_dp_start_link_train(struct intel_dp *intel_dp); |