Commit 36cd7444 authored by Dave Airlie's avatar Dave Airlie

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: default avatarTodd Previte <tprevite@gmail.com>
Signed-off-by: default avatarDave Airlie <airlied@redhat.com>
parent 44905a27
...@@ -2209,13 +2209,15 @@ static void intel_connector_info(struct seq_file *m, ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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;
encoder_enabled = encoder->get_hw_state(encoder, &pipe);
WARN(!encoder_enabled, "encoder not enabled\n");
if (WARN_ON(!encoder->base.crtc))
return;
crtc = encoder->base.crtc; crtc = encoder->base.crtc;
WARN(!crtc->enabled, "crtc not enabled\n"); WARN(!crtc->enabled, "crtc not enabled\n");
WARN(!to_intel_crtc(crtc)->active, "crtc not active\n"); WARN(!to_intel_crtc(crtc)->active, "crtc not active\n");
WARN(pipe != to_intel_crtc(crtc)->pipe, WARN(pipe != to_intel_crtc(crtc)->pipe,
"encoder active on the wrong pipe\n"); "encoder active on the wrong pipe\n");
}
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment