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
3 changed files with 27 additions and 18 deletions
|
@ -2209,13 +2209,15 @@ static void intel_connector_info(struct seq_file *m,
|
||||||
seq_printf(m, "\tCEA rev: %d\n",
|
seq_printf(m, "\tCEA rev: %d\n",
|
||||||
connector->display_info.cea_rev);
|
connector->display_info.cea_rev);
|
||||||
}
|
}
|
||||||
if (intel_encoder->type == INTEL_OUTPUT_DISPLAYPORT ||
|
if (intel_encoder) {
|
||||||
intel_encoder->type == INTEL_OUTPUT_EDP)
|
if (intel_encoder->type == INTEL_OUTPUT_DISPLAYPORT ||
|
||||||
intel_dp_info(m, intel_connector);
|
intel_encoder->type == INTEL_OUTPUT_EDP)
|
||||||
else if (intel_encoder->type == INTEL_OUTPUT_HDMI)
|
intel_dp_info(m, intel_connector);
|
||||||
intel_hdmi_info(m, intel_connector);
|
else if (intel_encoder->type == INTEL_OUTPUT_HDMI)
|
||||||
else if (intel_encoder->type == INTEL_OUTPUT_LVDS)
|
intel_hdmi_info(m, intel_connector);
|
||||||
intel_lvds_info(m, intel_connector);
|
else if (intel_encoder->type == INTEL_OUTPUT_LVDS)
|
||||||
|
intel_lvds_info(m, intel_connector);
|
||||||
|
}
|
||||||
|
|
||||||
seq_printf(m, "\tmodes:\n");
|
seq_printf(m, "\tmodes:\n");
|
||||||
list_for_each_entry(mode, &connector->modes, head)
|
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;
|
dev_priv->hpd_event_bits = 0;
|
||||||
list_for_each_entry(connector, &mode_config->connector_list, head) {
|
list_for_each_entry(connector, &mode_config->connector_list, head) {
|
||||||
intel_connector = to_intel_connector(connector);
|
intel_connector = to_intel_connector(connector);
|
||||||
|
if (!intel_connector->encoder)
|
||||||
|
continue;
|
||||||
intel_encoder = intel_connector->encoder;
|
intel_encoder = intel_connector->encoder;
|
||||||
if (intel_encoder->hpd_pin > HPD_NONE &&
|
if (intel_encoder->hpd_pin > HPD_NONE &&
|
||||||
dev_priv->hpd_stats[intel_encoder->hpd_pin].hpd_mark == HPD_MARK_DISABLED &&
|
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) {
|
list_for_each_entry(connector, &mode_config->connector_list, head) {
|
||||||
intel_connector = to_intel_connector(connector);
|
intel_connector = to_intel_connector(connector);
|
||||||
|
if (!intel_connector->encoder)
|
||||||
|
continue;
|
||||||
intel_encoder = intel_connector->encoder;
|
intel_encoder = intel_connector->encoder;
|
||||||
if (hpd_event_bits & (1 << intel_encoder->hpd_pin)) {
|
if (hpd_event_bits & (1 << intel_encoder->hpd_pin)) {
|
||||||
if (intel_encoder->hot_plug)
|
if (intel_encoder->hot_plug)
|
||||||
|
|
|
@ -5003,20 +5003,23 @@ static void intel_connector_check_state(struct intel_connector *connector)
|
||||||
"wrong connector dpms state\n");
|
"wrong connector dpms state\n");
|
||||||
WARN(connector->base.encoder != &encoder->base,
|
WARN(connector->base.encoder != &encoder->base,
|
||||||
"active connector not linked to encoder\n");
|
"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);
|
if (encoder) {
|
||||||
WARN(!encoder_enabled, "encoder not enabled\n");
|
WARN(!encoder->connectors_active,
|
||||||
if (WARN_ON(!encoder->base.crtc))
|
"encoder->connectors_active not set\n");
|
||||||
return;
|
|
||||||
|
|
||||||
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");
|
crtc = encoder->base.crtc;
|
||||||
WARN(!to_intel_crtc(crtc)->active, "crtc not active\n");
|
|
||||||
WARN(pipe != to_intel_crtc(crtc)->pipe,
|
WARN(!crtc->enabled, "crtc not enabled\n");
|
||||||
"encoder active on the wrong pipe\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…
Add table
Add a link
Reference in a new issue