aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2014-05-01 23:44:18 -0400
committerDave Airlie <airlied@redhat.com>2014-07-21 02:48:58 -0400
commit36cd7444c044806cd2a4e450a8385597221d5d25 (patch)
treef10068f47dd96af9ed84bdb2adeff950a4e601d1
parent44905a27dd01f2bddd96664d0ab7da43a07f4d5a (diff)
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>
-rw-r--r--drivers/gpu/drm/i915/i915_debugfs.c16
-rw-r--r--drivers/gpu/drm/i915/i915_irq.c4
-rw-r--r--drivers/gpu/drm/i915/intel_display.c25
3 files changed, 27 insertions, 18 deletions
diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c
index 4a5b0f80e059..f27daf70ba72 100644
--- a/drivers/gpu/drm/i915/i915_debugfs.c
+++ b/drivers/gpu/drm/i915/i915_debugfs.c
@@ -2209,13 +2209,15 @@ static void intel_connector_info(struct seq_file *m,
2209 seq_printf(m, "\tCEA rev: %d\n", 2209 seq_printf(m, "\tCEA rev: %d\n",
2210 connector->display_info.cea_rev); 2210 connector->display_info.cea_rev);
2211 } 2211 }
2212 if (intel_encoder->type == INTEL_OUTPUT_DISPLAYPORT || 2212 if (intel_encoder) {
2213 intel_encoder->type == INTEL_OUTPUT_EDP) 2213 if (intel_encoder->type == INTEL_OUTPUT_DISPLAYPORT ||
2214 intel_dp_info(m, intel_connector); 2214 intel_encoder->type == INTEL_OUTPUT_EDP)
2215 else if (intel_encoder->type == INTEL_OUTPUT_HDMI) 2215 intel_dp_info(m, intel_connector);
2216 intel_hdmi_info(m, intel_connector); 2216 else if (intel_encoder->type == INTEL_OUTPUT_HDMI)
2217 else if (intel_encoder->type == INTEL_OUTPUT_LVDS) 2217 intel_hdmi_info(m, intel_connector);
2218 intel_lvds_info(m, intel_connector); 2218 else if (intel_encoder->type == INTEL_OUTPUT_LVDS)
2219 intel_lvds_info(m, intel_connector);
2220 }
2219 2221
2220 seq_printf(m, "\tmodes:\n"); 2222 seq_printf(m, "\tmodes:\n");
2221 list_for_each_entry(mode, &connector->modes, head) 2223 list_for_each_entry(mode, &connector->modes, head)
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
index 026f0a3f3b90..12d77b5368c4 100644
--- a/drivers/gpu/drm/i915/i915_irq.c
+++ b/drivers/gpu/drm/i915/i915_irq.c
@@ -1165,6 +1165,8 @@ static void i915_hotplug_work_func(struct work_struct *work)
1165 dev_priv->hpd_event_bits = 0; 1165 dev_priv->hpd_event_bits = 0;
1166 list_for_each_entry(connector, &mode_config->connector_list, head) { 1166 list_for_each_entry(connector, &mode_config->connector_list, head) {
1167 intel_connector = to_intel_connector(connector); 1167 intel_connector = to_intel_connector(connector);
1168 if (!intel_connector->encoder)
1169 continue;
1168 intel_encoder = intel_connector->encoder; 1170 intel_encoder = intel_connector->encoder;
1169 if (intel_encoder->hpd_pin > HPD_NONE && 1171 if (intel_encoder->hpd_pin > HPD_NONE &&
1170 dev_priv->hpd_stats[intel_encoder->hpd_pin].hpd_mark == HPD_MARK_DISABLED && 1172 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 1197
1196 list_for_each_entry(connector, &mode_config->connector_list, head) { 1198 list_for_each_entry(connector, &mode_config->connector_list, head) {
1197 intel_connector = to_intel_connector(connector); 1199 intel_connector = to_intel_connector(connector);
1200 if (!intel_connector->encoder)
1201 continue;
1198 intel_encoder = intel_connector->encoder; 1202 intel_encoder = intel_connector->encoder;
1199 if (hpd_event_bits & (1 << intel_encoder->hpd_pin)) { 1203 if (hpd_event_bits & (1 << intel_encoder->hpd_pin)) {
1200 if (intel_encoder->hot_plug) 1204 if (intel_encoder->hot_plug)
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index e07e6b5dee35..008bb3dc88cb 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -5003,20 +5003,23 @@ static void intel_connector_check_state(struct intel_connector *connector)
5003 "wrong connector dpms state\n"); 5003 "wrong connector dpms state\n");
5004 WARN(connector->base.encoder != &encoder->base, 5004 WARN(connector->base.encoder != &encoder->base,
5005 "active connector not linked to encoder\n"); 5005 "active connector not linked to encoder\n");
5006 WARN(!encoder->connectors_active,
5007 "encoder->connectors_active not set\n");
5008 5006
5009 encoder_enabled = encoder->get_hw_state(encoder, &pipe); 5007 if (encoder) {
5010 WARN(!encoder_enabled, "encoder not enabled\n"); 5008 WARN(!encoder->connectors_active,
5011 if (WARN_ON(!encoder->base.crtc)) 5009 "encoder->connectors_active not set\n");
5012 return; 5010
5011 encoder_enabled = encoder->get_hw_state(encoder, &pipe);
5012 WARN(!encoder_enabled, "encoder not enabled\n");
5013 if (WARN_ON(!encoder->base.crtc))
5014 return;
5013 5015
5014 crtc = encoder->base.crtc; 5016 crtc = encoder->base.crtc;
5015 5017
5016 WARN(!crtc->enabled, "crtc not enabled\n"); 5018 WARN(!crtc->enabled, "crtc not enabled\n");
5017 WARN(!to_intel_crtc(crtc)->active, "crtc not active\n"); 5019 WARN(!to_intel_crtc(crtc)->active, "crtc not active\n");
5018 WARN(pipe != to_intel_crtc(crtc)->pipe, 5020 WARN(pipe != to_intel_crtc(crtc)->pipe,
5019 "encoder active on the wrong pipe\n"); 5021 "encoder active on the wrong pipe\n");
5022 }
5020 } 5023 }
5021} 5024}
5022 5025