| From fb4fea58f0910b13047947a03b8cfa8c5f5890d0 Mon Sep 17 00:00:00 2001 |
| From: Chris Wilson <chris@chris-wilson.co.uk> |
| Date: Tue, 25 Jun 2013 17:26:45 +0100 |
| Subject: drm/i915: Detect invalid scanout pitches |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| 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 <chris@chris-wilson.co.uk> |
| Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com> |
| Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch> |
| (cherry picked from commit a35cdaa0e13e24f3fccc518bfef1516aa8a8a665) |
| Signed-off-by: Darren Hart <dvhart@linux.intel.com> |
| --- |
| 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 0cc81f6c0af3..e441a4b5904a 100644 |
| --- a/drivers/gpu/drm/i915/intel_display.c |
| +++ b/drivers/gpu/drm/i915/intel_display.c |
| @@ -9128,6 +9128,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) { |
| @@ -9141,10 +9142,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.5.rc3 |
| |