mirror of https://gitee.com/openkylin/linux.git
drm/i915: check connector->encoder before using it.
DP MST will need connectors that aren't connected to specific encoders, add some checks in advance to avoid oopses. Reviewed-by: Todd Previte <tprevite@gmail.com> Signed-off-by: Dave Airlie <airlied@redhat.com>
This commit is contained in:
parent
44905a27dd
commit
36cd7444c0
|
@ -2209,13 +2209,15 @@ static void intel_connector_info(struct seq_file *m,
|
|||
seq_printf(m, "\tCEA rev: %d\n",
|
||||
connector->display_info.cea_rev);
|
||||
}
|
||||
if (intel_encoder->type == INTEL_OUTPUT_DISPLAYPORT ||
|
||||
intel_encoder->type == INTEL_OUTPUT_EDP)
|
||||
intel_dp_info(m, intel_connector);
|
||||
else if (intel_encoder->type == INTEL_OUTPUT_HDMI)
|
||||
intel_hdmi_info(m, intel_connector);
|
||||
else if (intel_encoder->type == INTEL_OUTPUT_LVDS)
|
||||
intel_lvds_info(m, intel_connector);
|
||||
if (intel_encoder) {
|
||||
if (intel_encoder->type == INTEL_OUTPUT_DISPLAYPORT ||
|
||||
intel_encoder->type == INTEL_OUTPUT_EDP)
|
||||
intel_dp_info(m, intel_connector);
|
||||
else if (intel_encoder->type == INTEL_OUTPUT_HDMI)
|
||||
intel_hdmi_info(m, intel_connector);
|
||||
else if (intel_encoder->type == INTEL_OUTPUT_LVDS)
|
||||
intel_lvds_info(m, intel_connector);
|
||||
}
|
||||
|
||||
seq_printf(m, "\tmodes:\n");
|
||||
list_for_each_entry(mode, &connector->modes, head)
|
||||
|
|
|
@ -1165,6 +1165,8 @@ static void i915_hotplug_work_func(struct work_struct *work)
|
|||
dev_priv->hpd_event_bits = 0;
|
||||
list_for_each_entry(connector, &mode_config->connector_list, head) {
|
||||
intel_connector = to_intel_connector(connector);
|
||||
if (!intel_connector->encoder)
|
||||
continue;
|
||||
intel_encoder = intel_connector->encoder;
|
||||
if (intel_encoder->hpd_pin > HPD_NONE &&
|
||||
dev_priv->hpd_stats[intel_encoder->hpd_pin].hpd_mark == HPD_MARK_DISABLED &&
|
||||
|
@ -1195,6 +1197,8 @@ static void i915_hotplug_work_func(struct work_struct *work)
|
|||
|
||||
list_for_each_entry(connector, &mode_config->connector_list, head) {
|
||||
intel_connector = to_intel_connector(connector);
|
||||
if (!intel_connector->encoder)
|
||||
continue;
|
||||
intel_encoder = intel_connector->encoder;
|
||||
if (hpd_event_bits & (1 << intel_encoder->hpd_pin)) {
|
||||
if (intel_encoder->hot_plug)
|
||||
|
|
|
@ -5003,20 +5003,23 @@ static void intel_connector_check_state(struct intel_connector *connector)
|
|||
"wrong connector dpms state\n");
|
||||
WARN(connector->base.encoder != &encoder->base,
|
||||
"active connector not linked to encoder\n");
|
||||
WARN(!encoder->connectors_active,
|
||||
"encoder->connectors_active not set\n");
|
||||
|
||||
encoder_enabled = encoder->get_hw_state(encoder, &pipe);
|
||||
WARN(!encoder_enabled, "encoder not enabled\n");
|
||||
if (WARN_ON(!encoder->base.crtc))
|
||||
return;
|
||||
if (encoder) {
|
||||
WARN(!encoder->connectors_active,
|
||||
"encoder->connectors_active not set\n");
|
||||
|
||||
crtc = encoder->base.crtc;
|
||||
encoder_enabled = encoder->get_hw_state(encoder, &pipe);
|
||||
WARN(!encoder_enabled, "encoder not enabled\n");
|
||||
if (WARN_ON(!encoder->base.crtc))
|
||||
return;
|
||||
|
||||
WARN(!crtc->enabled, "crtc not enabled\n");
|
||||
WARN(!to_intel_crtc(crtc)->active, "crtc not active\n");
|
||||
WARN(pipe != to_intel_crtc(crtc)->pipe,
|
||||
"encoder active on the wrong pipe\n");
|
||||
crtc = encoder->base.crtc;
|
||||
|
||||
WARN(!crtc->enabled, "crtc not enabled\n");
|
||||
WARN(!to_intel_crtc(crtc)->active, "crtc not active\n");
|
||||
WARN(pipe != to_intel_crtc(crtc)->pipe,
|
||||
"encoder active on the wrong pipe\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue