mirror of
https://github.com/FEX-Emu/linux.git
synced 2025-01-02 15:21:03 +00:00
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 21a8e6a485
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>
This commit is contained in:
parent
ed92f0b239
commit
16c255335b
@ -1356,7 +1356,8 @@ void intel_ddi_init(struct drm_device *dev, enum port port)
|
|||||||
intel_encoder->cloneable = false;
|
intel_encoder->cloneable = false;
|
||||||
intel_encoder->hot_plug = intel_ddi_hot_plug;
|
intel_encoder->hot_plug = intel_ddi_hot_plug;
|
||||||
|
|
||||||
intel_dp_init_connector(intel_dig_port, dp_connector);
|
if (!intel_dp_init_connector(intel_dig_port, dp_connector))
|
||||||
|
return;
|
||||||
|
|
||||||
if (intel_encoder->type != INTEL_OUTPUT_EDP) {
|
if (intel_encoder->type != INTEL_OUTPUT_EDP) {
|
||||||
hdmi_connector = kzalloc(sizeof(struct intel_connector),
|
hdmi_connector = kzalloc(sizeof(struct intel_connector),
|
||||||
|
@ -3035,7 +3035,7 @@ static bool intel_edp_init_connector(struct intel_dp *intel_dp,
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
bool
|
||||||
intel_dp_init_connector(struct intel_digital_port *intel_dig_port,
|
intel_dp_init_connector(struct intel_digital_port *intel_dig_port,
|
||||||
struct intel_connector *intel_connector)
|
struct intel_connector *intel_connector)
|
||||||
{
|
{
|
||||||
@ -3147,7 +3147,7 @@ intel_dp_init_connector(struct intel_digital_port *intel_dig_port,
|
|||||||
intel_dp_i2c_init(intel_dp, intel_connector, name);
|
intel_dp_i2c_init(intel_dp, intel_connector, name);
|
||||||
|
|
||||||
if (!intel_edp_init_connector(intel_dp, intel_connector))
|
if (!intel_edp_init_connector(intel_dp, intel_connector))
|
||||||
return;
|
return false;
|
||||||
|
|
||||||
intel_dp_add_properties(intel_dp, connector);
|
intel_dp_add_properties(intel_dp, connector);
|
||||||
|
|
||||||
@ -3159,6 +3159,8 @@ intel_dp_init_connector(struct intel_digital_port *intel_dig_port,
|
|||||||
u32 temp = I915_READ(PEG_BAND_GAP_DATA);
|
u32 temp = I915_READ(PEG_BAND_GAP_DATA);
|
||||||
I915_WRITE(PEG_BAND_GAP_DATA, (temp & ~0xf) | 0xd);
|
I915_WRITE(PEG_BAND_GAP_DATA, (temp & ~0xf) | 0xd);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -586,7 +586,7 @@ extern void intel_lvds_init(struct drm_device *dev);
|
|||||||
extern bool intel_is_dual_link_lvds(struct drm_device *dev);
|
extern bool intel_is_dual_link_lvds(struct drm_device *dev);
|
||||||
extern void intel_dp_init(struct drm_device *dev, int output_reg,
|
extern void intel_dp_init(struct drm_device *dev, int output_reg,
|
||||||
enum port port);
|
enum port port);
|
||||||
extern void intel_dp_init_connector(struct intel_digital_port *intel_dig_port,
|
extern bool intel_dp_init_connector(struct intel_digital_port *intel_dig_port,
|
||||||
struct intel_connector *intel_connector);
|
struct intel_connector *intel_connector);
|
||||||
extern void intel_dp_init_link_config(struct intel_dp *intel_dp);
|
extern void intel_dp_init_link_config(struct intel_dp *intel_dp);
|
||||||
extern void intel_dp_start_link_train(struct intel_dp *intel_dp);
|
extern void intel_dp_start_link_train(struct intel_dp *intel_dp);
|
||||||
|
Loading…
Reference in New Issue
Block a user