aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/intel_display.c
diff options
context:
space:
mode:
authorVille Syrjälä <ville.syrjala@linux.intel.com>2016-07-28 10:50:40 -0400
committerVille Syrjälä <ville.syrjala@linux.intel.com>2016-08-04 08:54:13 -0400
commit477321e0130c58f7fc3e41753ad95e934aaa7abc (patch)
tree5a1dd59145b5a1f6e847101e3a905a01d687b9bc /drivers/gpu/drm/i915/intel_display.c
parent64ee2fd25cc5ca86b18b153ac0f310964ca9fe0c (diff)
drm/i915: Reject mixing MST and SST/HDMI on the same digital port
We can't mix MST with SST/HDMI on the same physical port, so we'll need to reject such configurations in check_digital_port_conflicts(). Nothing else will prevent this as MST has its fake encoders and its own connectors so the cloning checks won't catch this. The same digital port can be used multiple times, but only if all the encoders involved are MST encoders, so we only want to check MST vs. SST/HDMI, not MST vs. MST. And SST/HDMI vs. SST/HDMI we already check. Cc: Maarten Lankhorst <maarten.lankhorst@linux.intel.com> Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Link: http://patchwork.freedesktop.org/patch/msgid/1469717448-4297-5-git-send-email-ville.syrjala@linux.intel.com Reviewed-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com> Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers/gpu/drm/i915/intel_display.c')
-rw-r--r--drivers/gpu/drm/i915/intel_display.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index da9dcacd49d5..483ddfe957f4 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -12300,6 +12300,7 @@ static bool check_digital_port_conflicts(struct drm_atomic_state *state)
12300 struct drm_device *dev = state->dev; 12300 struct drm_device *dev = state->dev;
12301 struct drm_connector *connector; 12301 struct drm_connector *connector;
12302 unsigned int used_ports = 0; 12302 unsigned int used_ports = 0;
12303 unsigned int used_mst_ports = 0;
12303 12304
12304 /* 12305 /*
12305 * Walk the connector list instead of the encoder 12306 * Walk the connector list instead of the encoder
@@ -12336,11 +12337,20 @@ static bool check_digital_port_conflicts(struct drm_atomic_state *state)
12336 return false; 12337 return false;
12337 12338
12338 used_ports |= port_mask; 12339 used_ports |= port_mask;
12340 break;
12341 case INTEL_OUTPUT_DP_MST:
12342 used_mst_ports |=
12343 1 << enc_to_mst(&encoder->base)->primary->port;
12344 break;
12339 default: 12345 default:
12340 break; 12346 break;
12341 } 12347 }
12342 } 12348 }
12343 12349
12350 /* can't mix MST and SST/HDMI on the same port */
12351 if (used_ports & used_mst_ports)
12352 return false;
12353
12344 return true; 12354 return true;
12345} 12355}
12346 12356