diff options
| -rw-r--r-- | drivers/gpu/drm/i915/i915_gem.c | 23 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/i915_gem_tiling.c | 14 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/i915_reg.h | 3 |
3 files changed, 34 insertions, 6 deletions
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index 717b6a854bcd..670d12881468 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c | |||
| @@ -1145,6 +1145,13 @@ int i915_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf) | |||
| 1145 | mutex_unlock(&dev->struct_mutex); | 1145 | mutex_unlock(&dev->struct_mutex); |
| 1146 | return VM_FAULT_SIGBUS; | 1146 | return VM_FAULT_SIGBUS; |
| 1147 | } | 1147 | } |
| 1148 | |||
| 1149 | ret = i915_gem_object_set_to_gtt_domain(obj, write); | ||
| 1150 | if (ret) { | ||
| 1151 | mutex_unlock(&dev->struct_mutex); | ||
| 1152 | return VM_FAULT_SIGBUS; | ||
| 1153 | } | ||
| 1154 | |||
| 1148 | list_add_tail(&obj_priv->list, &dev_priv->mm.inactive_list); | 1155 | list_add_tail(&obj_priv->list, &dev_priv->mm.inactive_list); |
| 1149 | } | 1156 | } |
| 1150 | 1157 | ||
| @@ -2128,8 +2135,10 @@ static void i830_write_fence_reg(struct drm_i915_fence_reg *reg) | |||
| 2128 | return; | 2135 | return; |
| 2129 | } | 2136 | } |
| 2130 | 2137 | ||
| 2131 | pitch_val = (obj_priv->stride / 128) - 1; | 2138 | pitch_val = obj_priv->stride / 128; |
| 2132 | WARN_ON(pitch_val & ~0x0000000f); | 2139 | pitch_val = ffs(pitch_val) - 1; |
| 2140 | WARN_ON(pitch_val > I830_FENCE_MAX_PITCH_VAL); | ||
| 2141 | |||
| 2133 | val = obj_priv->gtt_offset; | 2142 | val = obj_priv->gtt_offset; |
| 2134 | if (obj_priv->tiling_mode == I915_TILING_Y) | 2143 | if (obj_priv->tiling_mode == I915_TILING_Y) |
| 2135 | val |= 1 << I830_FENCE_TILING_Y_SHIFT; | 2144 | val |= 1 << I830_FENCE_TILING_Y_SHIFT; |
| @@ -2421,6 +2430,16 @@ i915_gem_clflush_object(struct drm_gem_object *obj) | |||
| 2421 | if (obj_priv->pages == NULL) | 2430 | if (obj_priv->pages == NULL) |
| 2422 | return; | 2431 | return; |
| 2423 | 2432 | ||
| 2433 | /* XXX: The 865 in particular appears to be weird in how it handles | ||
| 2434 | * cache flushing. We haven't figured it out, but the | ||
| 2435 | * clflush+agp_chipset_flush doesn't appear to successfully get the | ||
| 2436 | * data visible to the PGU, while wbinvd + agp_chipset_flush does. | ||
| 2437 | */ | ||
| 2438 | if (IS_I865G(obj->dev)) { | ||
| 2439 | wbinvd(); | ||
| 2440 | return; | ||
| 2441 | } | ||
| 2442 | |||
| 2424 | drm_clflush_pages(obj_priv->pages, obj->size / PAGE_SIZE); | 2443 | drm_clflush_pages(obj_priv->pages, obj->size / PAGE_SIZE); |
| 2425 | } | 2444 | } |
| 2426 | 2445 | ||
diff --git a/drivers/gpu/drm/i915/i915_gem_tiling.c b/drivers/gpu/drm/i915/i915_gem_tiling.c index 52a059354e83..540dd336e6ec 100644 --- a/drivers/gpu/drm/i915/i915_gem_tiling.c +++ b/drivers/gpu/drm/i915/i915_gem_tiling.c | |||
| @@ -213,7 +213,8 @@ i915_tiling_ok(struct drm_device *dev, int stride, int size, int tiling_mode) | |||
| 213 | if (tiling_mode == I915_TILING_NONE) | 213 | if (tiling_mode == I915_TILING_NONE) |
| 214 | return true; | 214 | return true; |
| 215 | 215 | ||
| 216 | if (tiling_mode == I915_TILING_Y && HAS_128_BYTE_Y_TILING(dev)) | 216 | if (!IS_I9XX(dev) || |
| 217 | (tiling_mode == I915_TILING_Y && HAS_128_BYTE_Y_TILING(dev))) | ||
| 217 | tile_width = 128; | 218 | tile_width = 128; |
| 218 | else | 219 | else |
| 219 | tile_width = 512; | 220 | tile_width = 512; |
| @@ -225,11 +226,18 @@ i915_tiling_ok(struct drm_device *dev, int stride, int size, int tiling_mode) | |||
| 225 | if (stride / 128 > I965_FENCE_MAX_PITCH_VAL) | 226 | if (stride / 128 > I965_FENCE_MAX_PITCH_VAL) |
| 226 | return false; | 227 | return false; |
| 227 | } else if (IS_I9XX(dev)) { | 228 | } else if (IS_I9XX(dev)) { |
| 228 | if (stride / tile_width > I830_FENCE_MAX_PITCH_VAL || | 229 | uint32_t pitch_val = ffs(stride / tile_width) - 1; |
| 230 | |||
| 231 | /* XXX: For Y tiling, FENCE_MAX_PITCH_VAL is actually 6 (8KB) | ||
| 232 | * instead of 4 (2KB) on 945s. | ||
| 233 | */ | ||
| 234 | if (pitch_val > I915_FENCE_MAX_PITCH_VAL || | ||
| 229 | size > (I830_FENCE_MAX_SIZE_VAL << 20)) | 235 | size > (I830_FENCE_MAX_SIZE_VAL << 20)) |
| 230 | return false; | 236 | return false; |
| 231 | } else { | 237 | } else { |
| 232 | if (stride / 128 > I830_FENCE_MAX_PITCH_VAL || | 238 | uint32_t pitch_val = ffs(stride / tile_width) - 1; |
| 239 | |||
| 240 | if (pitch_val > I830_FENCE_MAX_PITCH_VAL || | ||
| 233 | size > (I830_FENCE_MAX_SIZE_VAL << 19)) | 241 | size > (I830_FENCE_MAX_SIZE_VAL << 19)) |
| 234 | return false; | 242 | return false; |
| 235 | } | 243 | } |
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h index 9668cc0d7f4e..375569d01d01 100644 --- a/drivers/gpu/drm/i915/i915_reg.h +++ b/drivers/gpu/drm/i915/i915_reg.h | |||
| @@ -190,7 +190,8 @@ | |||
| 190 | #define I830_FENCE_SIZE_BITS(size) ((ffs((size) >> 19) - 1) << 8) | 190 | #define I830_FENCE_SIZE_BITS(size) ((ffs((size) >> 19) - 1) << 8) |
| 191 | #define I830_FENCE_PITCH_SHIFT 4 | 191 | #define I830_FENCE_PITCH_SHIFT 4 |
| 192 | #define I830_FENCE_REG_VALID (1<<0) | 192 | #define I830_FENCE_REG_VALID (1<<0) |
| 193 | #define I830_FENCE_MAX_PITCH_VAL 0x10 | 193 | #define I915_FENCE_MAX_PITCH_VAL 0x10 |
| 194 | #define I830_FENCE_MAX_PITCH_VAL 6 | ||
| 194 | #define I830_FENCE_MAX_SIZE_VAL (1<<8) | 195 | #define I830_FENCE_MAX_SIZE_VAL (1<<8) |
| 195 | 196 | ||
| 196 | #define I915_FENCE_START_MASK 0x0ff00000 | 197 | #define I915_FENCE_START_MASK 0x0ff00000 |
