aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaulo Zanoni <paulo.r.zanoni@intel.com>2014-01-07 11:55:53 -0500
committerDaniel Vetter <daniel.vetter@ffwll.ch>2014-01-10 11:56:39 -0500
commit5a65f3582e011d0de947420b89c13442a2fda5b8 (patch)
tree5f53a3aaf5c56e5fe1ece1b5a45ab28ff06146c7
parentfeb56b934463a7339ebc3c3cf2497c7958fe5a60 (diff)
drm/i915: don't set modes for 2 connectors on the same encoder
In some cases we have more than 1 connector associated to an encoder (e.g., SDVO, Haswell DP/HDMI) and we can only set a mode for one of these connectors. If we only allowed modesets for connected connectors we would never need this patch, but since we do allow modeset for disconnected connectors we may see user space trying to set modes on the two connectors attached to the same encoder, so we need to forbid that. This problem can be reproduced by running the following intel-gpu-tools test case: ./kms_setmode --run-subtest clone-exclusive-crtc Thanks to Daniel Vetter for providing a version of this patch on pastebin. Credits-to: Daniel Vetter <daniel.vetter@ffwll.ch> Signed-off-by: Paulo Zanoni <paulo.r.zanoni@intel.com> Reviewed-by: Damien Lespiau <damien.lespiau@intel.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
-rw-r--r--drivers/gpu/drm/i915/intel_display.c12
1 files changed, 8 insertions, 4 deletions
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index c4d3f4391686..507fb19c7591 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -9923,17 +9923,21 @@ intel_modeset_stage_output_state(struct drm_device *dev,
9923 /* Check for any encoders that needs to be disabled. */ 9923 /* Check for any encoders that needs to be disabled. */
9924 list_for_each_entry(encoder, &dev->mode_config.encoder_list, 9924 list_for_each_entry(encoder, &dev->mode_config.encoder_list,
9925 base.head) { 9925 base.head) {
9926 int num_connectors = 0;
9926 list_for_each_entry(connector, 9927 list_for_each_entry(connector,
9927 &dev->mode_config.connector_list, 9928 &dev->mode_config.connector_list,
9928 base.head) { 9929 base.head) {
9929 if (connector->new_encoder == encoder) { 9930 if (connector->new_encoder == encoder) {
9930 WARN_ON(!connector->new_encoder->new_crtc); 9931 WARN_ON(!connector->new_encoder->new_crtc);
9931 9932 num_connectors++;
9932 goto next_encoder;
9933 } 9933 }
9934 } 9934 }
9935 encoder->new_crtc = NULL; 9935
9936next_encoder: 9936 if (num_connectors == 0)
9937 encoder->new_crtc = NULL;
9938 else if (num_connectors > 1)
9939 return -EINVAL;
9940
9937 /* Only now check for crtc changes so we don't miss encoders 9941 /* Only now check for crtc changes so we don't miss encoders
9938 * that will be disabled. */ 9942 * that will be disabled. */
9939 if (&encoder->new_crtc->base != encoder->base.crtc) { 9943 if (&encoder->new_crtc->base != encoder->base.crtc) {