aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVille Syrjälä <ville.syrjala@linux.intel.com>2017-11-14 13:32:58 -0500
committerVille Syrjälä <ville.syrjala@linux.intel.com>2018-01-29 14:55:07 -0500
commite995ca0b8139c5f6807095464e969931b443f55a (patch)
treed08d7fd4f0bb93e7414ae2b4ce16a974296cf429
parent75a655e0a26cf0bfbaaa8df0ff5a9d1807bb1f4e (diff)
drm/i915: Provide a device level .mode_valid() hook
We never support certain mode flags etc. Reject those early on in the mode_config.mode_valid() hook. That allows us to remove some duplicated checks from the connector .mode_valid() hooks, and it guarantees that we never see those flags even from user mode as the mode_config.mode_valid() hooks gets executed for those as well. Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20171114183258.16976-11-ville.syrjala@linux.intel.com Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
-rw-r--r--drivers/gpu/drm/i915/intel_crt.c3
-rw-r--r--drivers/gpu/drm/i915/intel_display.c27
-rw-r--r--drivers/gpu/drm/i915/intel_dsi.c5
-rw-r--r--drivers/gpu/drm/i915/intel_dvo.c3
-rw-r--r--drivers/gpu/drm/i915/intel_fbc.c3
-rw-r--r--drivers/gpu/drm/i915/intel_hdmi.c3
-rw-r--r--drivers/gpu/drm/i915/intel_sdvo.c3
7 files changed, 28 insertions, 19 deletions
diff --git a/drivers/gpu/drm/i915/intel_crt.c b/drivers/gpu/drm/i915/intel_crt.c
index 9f31aea51dff..1cd4a7c22bd5 100644
--- a/drivers/gpu/drm/i915/intel_crt.c
+++ b/drivers/gpu/drm/i915/intel_crt.c
@@ -304,9 +304,6 @@ intel_crt_mode_valid(struct drm_connector *connector,
304 int max_dotclk = dev_priv->max_dotclk_freq; 304 int max_dotclk = dev_priv->max_dotclk_freq;
305 int max_clock; 305 int max_clock;
306 306
307 if (mode->flags & DRM_MODE_FLAG_DBLSCAN)
308 return MODE_NO_DBLESCAN;
309
310 if (mode->clock < 25000) 307 if (mode->clock < 25000)
311 return MODE_CLOCK_LOW; 308 return MODE_CLOCK_LOW;
312 309
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index eb2322175624..9803da5fd6b3 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -14082,10 +14082,37 @@ static void intel_atomic_state_free(struct drm_atomic_state *state)
14082 kfree(state); 14082 kfree(state);
14083} 14083}
14084 14084
14085static enum drm_mode_status
14086intel_mode_valid(struct drm_device *dev,
14087 const struct drm_display_mode *mode)
14088{
14089 if (mode->vscan > 1)
14090 return MODE_NO_VSCAN;
14091
14092 if (mode->flags & DRM_MODE_FLAG_DBLSCAN)
14093 return MODE_NO_DBLESCAN;
14094
14095 if (mode->flags & DRM_MODE_FLAG_HSKEW)
14096 return MODE_H_ILLEGAL;
14097
14098 if (mode->flags & (DRM_MODE_FLAG_CSYNC |
14099 DRM_MODE_FLAG_NCSYNC |
14100 DRM_MODE_FLAG_PCSYNC))
14101 return MODE_HSYNC;
14102
14103 if (mode->flags & (DRM_MODE_FLAG_BCAST |
14104 DRM_MODE_FLAG_PIXMUX |
14105 DRM_MODE_FLAG_CLKDIV2))
14106 return MODE_BAD;
14107
14108 return MODE_OK;
14109}
14110
14085static const struct drm_mode_config_funcs intel_mode_funcs = { 14111static const struct drm_mode_config_funcs intel_mode_funcs = {
14086 .fb_create = intel_user_framebuffer_create, 14112 .fb_create = intel_user_framebuffer_create,
14087 .get_format_info = intel_get_format_info, 14113 .get_format_info = intel_get_format_info,
14088 .output_poll_changed = intel_fbdev_output_poll_changed, 14114 .output_poll_changed = intel_fbdev_output_poll_changed,
14115 .mode_valid = intel_mode_valid,
14089 .atomic_check = intel_atomic_check, 14116 .atomic_check = intel_atomic_check,
14090 .atomic_commit = intel_atomic_commit, 14117 .atomic_commit = intel_atomic_commit,
14091 .atomic_state_alloc = intel_atomic_state_alloc, 14118 .atomic_state_alloc = intel_atomic_state_alloc,
diff --git a/drivers/gpu/drm/i915/intel_dsi.c b/drivers/gpu/drm/i915/intel_dsi.c
index f67d321376e4..51a1d6868b1e 100644
--- a/drivers/gpu/drm/i915/intel_dsi.c
+++ b/drivers/gpu/drm/i915/intel_dsi.c
@@ -1266,11 +1266,6 @@ intel_dsi_mode_valid(struct drm_connector *connector,
1266 1266
1267 DRM_DEBUG_KMS("\n"); 1267 DRM_DEBUG_KMS("\n");
1268 1268
1269 if (mode->flags & DRM_MODE_FLAG_DBLSCAN) {
1270 DRM_DEBUG_KMS("MODE_NO_DBLESCAN\n");
1271 return MODE_NO_DBLESCAN;
1272 }
1273
1274 if (fixed_mode) { 1269 if (fixed_mode) {
1275 if (mode->hdisplay > fixed_mode->hdisplay) 1270 if (mode->hdisplay > fixed_mode->hdisplay)
1276 return MODE_PANEL; 1271 return MODE_PANEL;
diff --git a/drivers/gpu/drm/i915/intel_dvo.c b/drivers/gpu/drm/i915/intel_dvo.c
index 754baa00bea9..59c066ca14e5 100644
--- a/drivers/gpu/drm/i915/intel_dvo.c
+++ b/drivers/gpu/drm/i915/intel_dvo.c
@@ -219,9 +219,6 @@ intel_dvo_mode_valid(struct drm_connector *connector,
219 int max_dotclk = to_i915(connector->dev)->max_dotclk_freq; 219 int max_dotclk = to_i915(connector->dev)->max_dotclk_freq;
220 int target_clock = mode->clock; 220 int target_clock = mode->clock;
221 221
222 if (mode->flags & DRM_MODE_FLAG_DBLSCAN)
223 return MODE_NO_DBLESCAN;
224
225 /* XXX: Validate clock range */ 222 /* XXX: Validate clock range */
226 223
227 if (fixed_mode) { 224 if (fixed_mode) {
diff --git a/drivers/gpu/drm/i915/intel_fbc.c b/drivers/gpu/drm/i915/intel_fbc.c
index f88c1b5dae4c..eee1b02c827e 100644
--- a/drivers/gpu/drm/i915/intel_fbc.c
+++ b/drivers/gpu/drm/i915/intel_fbc.c
@@ -794,8 +794,7 @@ static bool intel_fbc_can_activate(struct intel_crtc *crtc)
794 return false; 794 return false;
795 } 795 }
796 796
797 if ((cache->crtc.mode_flags & DRM_MODE_FLAG_INTERLACE) || 797 if (cache->crtc.mode_flags & DRM_MODE_FLAG_INTERLACE) {
798 (cache->crtc.mode_flags & DRM_MODE_FLAG_DBLSCAN)) {
799 fbc->no_fbc_reason = "incompatible mode"; 798 fbc->no_fbc_reason = "incompatible mode";
800 return false; 799 return false;
801 } 800 }
diff --git a/drivers/gpu/drm/i915/intel_hdmi.c b/drivers/gpu/drm/i915/intel_hdmi.c
index bced7b954d93..8a9a925410e5 100644
--- a/drivers/gpu/drm/i915/intel_hdmi.c
+++ b/drivers/gpu/drm/i915/intel_hdmi.c
@@ -1314,9 +1314,6 @@ intel_hdmi_mode_valid(struct drm_connector *connector,
1314 bool force_dvi = 1314 bool force_dvi =
1315 READ_ONCE(to_intel_digital_connector_state(connector->state)->force_audio) == HDMI_AUDIO_OFF_DVI; 1315 READ_ONCE(to_intel_digital_connector_state(connector->state)->force_audio) == HDMI_AUDIO_OFF_DVI;
1316 1316
1317 if (mode->flags & DRM_MODE_FLAG_DBLSCAN)
1318 return MODE_NO_DBLESCAN;
1319
1320 clock = mode->clock; 1317 clock = mode->clock;
1321 1318
1322 if ((mode->flags & DRM_MODE_FLAG_3D_MASK) == DRM_MODE_FLAG_3D_FRAME_PACKING) 1319 if ((mode->flags & DRM_MODE_FLAG_3D_MASK) == DRM_MODE_FLAG_3D_FRAME_PACKING)
diff --git a/drivers/gpu/drm/i915/intel_sdvo.c b/drivers/gpu/drm/i915/intel_sdvo.c
index 2b8764897d68..0bf97ed5ffac 100644
--- a/drivers/gpu/drm/i915/intel_sdvo.c
+++ b/drivers/gpu/drm/i915/intel_sdvo.c
@@ -1607,9 +1607,6 @@ intel_sdvo_mode_valid(struct drm_connector *connector,
1607 struct intel_sdvo *intel_sdvo = intel_attached_sdvo(connector); 1607 struct intel_sdvo *intel_sdvo = intel_attached_sdvo(connector);
1608 int max_dotclk = to_i915(connector->dev)->max_dotclk_freq; 1608 int max_dotclk = to_i915(connector->dev)->max_dotclk_freq;
1609 1609
1610 if (mode->flags & DRM_MODE_FLAG_DBLSCAN)
1611 return MODE_NO_DBLESCAN;
1612
1613 if (intel_sdvo->pixel_clock_min > mode->clock) 1610 if (intel_sdvo->pixel_clock_min > mode->clock)
1614 return MODE_CLOCK_LOW; 1611 return MODE_CLOCK_LOW;
1615 1612