Report back the user error of attempting to setup a CRTC with an invalid
framebuffer pitch. This is trickier than it should be as on gen4, there
is a restriction that tiled surfaces must have a stride less than 16k -
which is less than the largest supported CRTC size.

v2: Fix the limits for gen3
v3: Move check into intel_framebuffer_init() and fix VLV limits. (vsyrjala)
v4: Use idiomatic '>=' for generation checks

References: https://bugs.freedesktop.org/show_bug.cgi?id=65099
Signed-off-by: Chris Wilson <[email protected]>
Reviewed-by: Ville Syrjälä <[email protected]>
---
 drivers/gpu/drm/i915/intel_display.c | 25 +++++++++++++++++++++----
 1 file changed, 21 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_display.c 
b/drivers/gpu/drm/i915/intel_display.c
index 0d76595..ae6f71f 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -9224,6 +9224,7 @@ int intel_framebuffer_init(struct drm_device *dev,
                           struct drm_mode_fb_cmd2 *mode_cmd,
                           struct drm_i915_gem_object *obj)
 {
+       int pitch_limit;
        int ret;
 
        if (obj->tiling_mode == I915_TILING_Y) {
@@ -9237,10 +9238,26 @@ int intel_framebuffer_init(struct drm_device *dev,
                return -EINVAL;
        }
 
-       /* FIXME <= Gen4 stride limits are bit unclear */
-       if (mode_cmd->pitches[0] > 32768) {
-               DRM_DEBUG("pitch (%d) must be at less than 32768\n",
-                         mode_cmd->pitches[0]);
+       if (INTEL_INFO(dev)->gen >= 5 && !IS_VALLEYVIEW(dev)) {
+               pitch_limit = 32*1024;
+       } else if (INTEL_INFO(dev)->gen >= 4) {
+               if (obj->tiling_mode)
+                       pitch_limit = 16*1024;
+               else
+                       pitch_limit = 32*1024;
+       } else if (INTEL_INFO(dev)->gen >= 3) {
+               if (obj->tiling_mode)
+                       pitch_limit = 8*1024;
+               else
+                       pitch_limit = 16*1024;
+       } else
+               /* XXX DSPC is limited to 4k tiled */
+               pitch_limit = 8*1024;
+
+       if (mode_cmd->pitches[0] > pitch_limit) {
+               DRM_DEBUG("%s pitch (%d) must be at less than %d\n",
+                         obj->tiling_mode ? "tiled" : "linear",
+                         mode_cmd->pitches[0], pitch_limit);
                return -EINVAL;
        }
 
-- 
1.8.3.1

_______________________________________________
Intel-gfx mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to