diff options
| -rw-r--r-- | drivers/gpu/drm/i915/i915_gem.c | 6 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/i915_gem_tiling.c | 22 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/i915_reg.h | 2 |
3 files changed, 16 insertions, 14 deletions
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index 80871c62a571..8a8771711cef 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c | |||
| @@ -2362,6 +2362,12 @@ static void i915_write_fence_reg(struct drm_i915_fence_reg *reg) | |||
| 2362 | pitch_val = obj_priv->stride / tile_width; | 2362 | pitch_val = obj_priv->stride / tile_width; |
| 2363 | pitch_val = ffs(pitch_val) - 1; | 2363 | pitch_val = ffs(pitch_val) - 1; |
| 2364 | 2364 | ||
| 2365 | if (obj_priv->tiling_mode == I915_TILING_Y && | ||
| 2366 | HAS_128_BYTE_Y_TILING(dev)) | ||
| 2367 | WARN_ON(pitch_val > I830_FENCE_MAX_PITCH_VAL); | ||
| 2368 | else | ||
| 2369 | WARN_ON(pitch_val > I915_FENCE_MAX_PITCH_VAL); | ||
| 2370 | |||
| 2365 | val = obj_priv->gtt_offset; | 2371 | val = obj_priv->gtt_offset; |
| 2366 | if (obj_priv->tiling_mode == I915_TILING_Y) | 2372 | if (obj_priv->tiling_mode == I915_TILING_Y) |
| 2367 | val |= 1 << I830_FENCE_TILING_Y_SHIFT; | 2373 | val |= 1 << I830_FENCE_TILING_Y_SHIFT; |
diff --git a/drivers/gpu/drm/i915/i915_gem_tiling.c b/drivers/gpu/drm/i915/i915_gem_tiling.c index 449157f71610..4bdccefcf2cf 100644 --- a/drivers/gpu/drm/i915/i915_gem_tiling.c +++ b/drivers/gpu/drm/i915/i915_gem_tiling.c | |||
| @@ -202,21 +202,17 @@ i915_tiling_ok(struct drm_device *dev, int stride, int size, int tiling_mode) | |||
| 202 | * reg, so dont bother to check the size */ | 202 | * reg, so dont bother to check the size */ |
| 203 | if (stride / 128 > I965_FENCE_MAX_PITCH_VAL) | 203 | if (stride / 128 > I965_FENCE_MAX_PITCH_VAL) |
| 204 | return false; | 204 | return false; |
| 205 | } else if (IS_I9XX(dev)) { | 205 | } else if (IS_GEN3(dev) || IS_GEN2(dev)) { |
| 206 | uint32_t pitch_val = ffs(stride / tile_width) - 1; | 206 | if (stride > 8192) |
| 207 | |||
| 208 | /* XXX: For Y tiling, FENCE_MAX_PITCH_VAL is actually 6 (8KB) | ||
| 209 | * instead of 4 (2KB) on 945s. | ||
| 210 | */ | ||
| 211 | if (pitch_val > I915_FENCE_MAX_PITCH_VAL || | ||
| 212 | size > (I830_FENCE_MAX_SIZE_VAL << 20)) | ||
| 213 | return false; | 207 | return false; |
| 214 | } else { | ||
| 215 | uint32_t pitch_val = ffs(stride / tile_width) - 1; | ||
| 216 | 208 | ||
| 217 | if (pitch_val > I830_FENCE_MAX_PITCH_VAL || | 209 | if (IS_GEN3(dev)) { |
| 218 | size > (I830_FENCE_MAX_SIZE_VAL << 19)) | 210 | if (size > I830_FENCE_MAX_SIZE_VAL << 20) |
| 219 | return false; | 211 | return false; |
| 212 | } else { | ||
| 213 | if (size > I830_FENCE_MAX_SIZE_VAL << 19) | ||
| 214 | return false; | ||
| 215 | } | ||
| 220 | } | 216 | } |
| 221 | 217 | ||
| 222 | /* 965+ just needs multiples of tile width */ | 218 | /* 965+ just needs multiples of tile width */ |
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h index cbbf59f56dfa..773c1adb2541 100644 --- a/drivers/gpu/drm/i915/i915_reg.h +++ b/drivers/gpu/drm/i915/i915_reg.h | |||
| @@ -241,7 +241,7 @@ | |||
| 241 | #define I830_FENCE_SIZE_BITS(size) ((ffs((size) >> 19) - 1) << 8) | 241 | #define I830_FENCE_SIZE_BITS(size) ((ffs((size) >> 19) - 1) << 8) |
| 242 | #define I830_FENCE_PITCH_SHIFT 4 | 242 | #define I830_FENCE_PITCH_SHIFT 4 |
| 243 | #define I830_FENCE_REG_VALID (1<<0) | 243 | #define I830_FENCE_REG_VALID (1<<0) |
| 244 | #define I915_FENCE_MAX_PITCH_VAL 0x10 | 244 | #define I915_FENCE_MAX_PITCH_VAL 4 |
| 245 | #define I830_FENCE_MAX_PITCH_VAL 6 | 245 | #define I830_FENCE_MAX_PITCH_VAL 6 |
| 246 | #define I830_FENCE_MAX_SIZE_VAL (1<<8) | 246 | #define I830_FENCE_MAX_SIZE_VAL (1<<8) |
| 247 | 247 | ||
