aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2016-08-05 05:14:23 -0400
committerChris Wilson <chris@chris-wilson.co.uk>2016-08-05 05:54:43 -0400
commit3e510a8e65ef6d1cf45c18bf79c8f91ec481f154 (patch)
treea17a4c68cb4c29a769b1db3187d2b04b5043a27e
parentdeeb1519b65a92ca06c8e8554a92df0fdb4d5dea (diff)
drm/i915: Repack fence tiling mode and stride into a single integer
In the previous commit, we moved the obj->tiling_mode out of a bitfield and into its own integer so that we could safely use READ_ONCE(). Let us now repair some of that damage by sharing the tiling_mode with its companion, the fence stride. v2: New magic Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Reviewed-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com> Link: http://patchwork.freedesktop.org/patch/msgid/1470388464-28458-18-git-send-email-chris@chris-wilson.co.uk
-rw-r--r--drivers/gpu/drm/i915/i915_debugfs.c2
-rw-r--r--drivers/gpu/drm/i915/i915_drv.h30
-rw-r--r--drivers/gpu/drm/i915/i915_gem.c20
-rw-r--r--drivers/gpu/drm/i915/i915_gem_execbuffer.c2
-rw-r--r--drivers/gpu/drm/i915/i915_gem_fence.c39
-rw-r--r--drivers/gpu/drm/i915/i915_gem_tiling.c19
-rw-r--r--drivers/gpu/drm/i915/i915_gpu_error.c2
-rw-r--r--drivers/gpu/drm/i915/intel_display.c34
-rw-r--r--drivers/gpu/drm/i915/intel_fbc.c2
-rw-r--r--drivers/gpu/drm/i915/intel_overlay.c2
-rw-r--r--drivers/gpu/drm/i915/intel_pm.c2
-rw-r--r--drivers/gpu/drm/i915/intel_sprite.c12
12 files changed, 98 insertions, 68 deletions
diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c
index 1faea382dfeb..0620a84d00ca 100644
--- a/drivers/gpu/drm/i915/i915_debugfs.c
+++ b/drivers/gpu/drm/i915/i915_debugfs.c
@@ -101,7 +101,7 @@ static char get_pin_flag(struct drm_i915_gem_object *obj)
101 101
102static char get_tiling_flag(struct drm_i915_gem_object *obj) 102static char get_tiling_flag(struct drm_i915_gem_object *obj)
103{ 103{
104 switch (obj->tiling_mode) { 104 switch (i915_gem_object_get_tiling(obj)) {
105 default: 105 default:
106 case I915_TILING_NONE: return ' '; 106 case I915_TILING_NONE: return ' ';
107 case I915_TILING_X: return 'X'; 107 case I915_TILING_X: return 'X';
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index f18d8761305c..feec00f769e1 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -2214,13 +2214,11 @@ struct drm_i915_gem_object {
2214 2214
2215 atomic_t frontbuffer_bits; 2215 atomic_t frontbuffer_bits;
2216 2216
2217 /**
2218 * Current tiling mode for the object.
2219 */
2220 unsigned int tiling_mode;
2221
2222 /** Current tiling stride for the object, if it's tiled. */ 2217 /** Current tiling stride for the object, if it's tiled. */
2223 uint32_t stride; 2218 unsigned int tiling_and_stride;
2219#define FENCE_MINIMUM_STRIDE 128 /* See i915_tiling_ok() */
2220#define TILING_MASK (FENCE_MINIMUM_STRIDE-1)
2221#define STRIDE_MASK (~TILING_MASK)
2224 2222
2225 unsigned int has_wc_mmap; 2223 unsigned int has_wc_mmap;
2226 /** Count of VMA actually bound by this object */ 2224 /** Count of VMA actually bound by this object */
@@ -2359,6 +2357,24 @@ i915_gem_object_has_active_engine(const struct drm_i915_gem_object *obj,
2359 return obj->flags & BIT(engine + I915_BO_ACTIVE_SHIFT); 2357 return obj->flags & BIT(engine + I915_BO_ACTIVE_SHIFT);
2360} 2358}
2361 2359
2360static inline unsigned int
2361i915_gem_object_get_tiling(struct drm_i915_gem_object *obj)
2362{
2363 return obj->tiling_and_stride & TILING_MASK;
2364}
2365
2366static inline bool
2367i915_gem_object_is_tiled(struct drm_i915_gem_object *obj)
2368{
2369 return i915_gem_object_get_tiling(obj) != I915_TILING_NONE;
2370}
2371
2372static inline unsigned int
2373i915_gem_object_get_stride(struct drm_i915_gem_object *obj)
2374{
2375 return obj->tiling_and_stride & STRIDE_MASK;
2376}
2377
2362/* 2378/*
2363 * Optimised SGL iterator for GEM objects 2379 * Optimised SGL iterator for GEM objects
2364 */ 2380 */
@@ -3457,7 +3473,7 @@ static inline bool i915_gem_object_needs_bit17_swizzle(struct drm_i915_gem_objec
3457 struct drm_i915_private *dev_priv = to_i915(obj->base.dev); 3473 struct drm_i915_private *dev_priv = to_i915(obj->base.dev);
3458 3474
3459 return dev_priv->mm.bit_6_swizzle_x == I915_BIT_6_SWIZZLE_9_10_17 && 3475 return dev_priv->mm.bit_6_swizzle_x == I915_BIT_6_SWIZZLE_9_10_17 &&
3460 obj->tiling_mode != I915_TILING_NONE; 3476 i915_gem_object_is_tiled(obj);
3461} 3477}
3462 3478
3463/* i915_debugfs.c */ 3479/* i915_debugfs.c */
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index 4e66045439b8..7a00678ae729 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -1042,7 +1042,7 @@ i915_gem_gtt_pwrite_fast(struct drm_i915_private *i915,
1042 int ret; 1042 int ret;
1043 bool hit_slow_path = false; 1043 bool hit_slow_path = false;
1044 1044
1045 if (obj->tiling_mode != I915_TILING_NONE) 1045 if (i915_gem_object_is_tiled(obj))
1046 return -EFAULT; 1046 return -EFAULT;
1047 1047
1048 ret = i915_gem_object_ggtt_pin(obj, NULL, 0, 0, 1048 ret = i915_gem_object_ggtt_pin(obj, NULL, 0, 0,
@@ -1671,7 +1671,7 @@ int i915_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
1671 1671
1672 /* Use a partial view if the object is bigger than the aperture. */ 1672 /* Use a partial view if the object is bigger than the aperture. */
1673 if (obj->base.size >= ggtt->mappable_end && 1673 if (obj->base.size >= ggtt->mappable_end &&
1674 obj->tiling_mode == I915_TILING_NONE) { 1674 !i915_gem_object_is_tiled(obj)) {
1675 static const unsigned int chunk_size = 256; // 1 MiB 1675 static const unsigned int chunk_size = 256; // 1 MiB
1676 1676
1677 memset(&view, 0, sizeof(view)); 1677 memset(&view, 0, sizeof(view));
@@ -2189,7 +2189,7 @@ i915_gem_object_get_pages_gtt(struct drm_i915_gem_object *obj)
2189 if (i915_gem_object_needs_bit17_swizzle(obj)) 2189 if (i915_gem_object_needs_bit17_swizzle(obj))
2190 i915_gem_object_do_bit_17_swizzle(obj); 2190 i915_gem_object_do_bit_17_swizzle(obj);
2191 2191
2192 if (obj->tiling_mode != I915_TILING_NONE && 2192 if (i915_gem_object_is_tiled(obj) &&
2193 dev_priv->quirks & QUIRK_PIN_SWIZZLED_PAGES) 2193 dev_priv->quirks & QUIRK_PIN_SWIZZLED_PAGES)
2194 i915_gem_object_pin_pages(obj); 2194 i915_gem_object_pin_pages(obj);
2195 2195
@@ -2938,10 +2938,12 @@ i915_vma_insert(struct i915_vma *vma, u64 size, u64 alignment, u64 flags)
2938 2938
2939 size = max(size, vma->size); 2939 size = max(size, vma->size);
2940 if (flags & PIN_MAPPABLE) 2940 if (flags & PIN_MAPPABLE)
2941 size = i915_gem_get_ggtt_size(dev_priv, size, obj->tiling_mode); 2941 size = i915_gem_get_ggtt_size(dev_priv, size,
2942 i915_gem_object_get_tiling(obj));
2942 2943
2943 min_alignment = 2944 min_alignment =
2944 i915_gem_get_ggtt_alignment(dev_priv, size, obj->tiling_mode, 2945 i915_gem_get_ggtt_alignment(dev_priv, size,
2946 i915_gem_object_get_tiling(obj),
2945 flags & PIN_MAPPABLE); 2947 flags & PIN_MAPPABLE);
2946 if (alignment == 0) 2948 if (alignment == 0)
2947 alignment = min_alignment; 2949 alignment = min_alignment;
@@ -3637,10 +3639,10 @@ void __i915_vma_set_map_and_fenceable(struct i915_vma *vma)
3637 3639
3638 fence_size = i915_gem_get_ggtt_size(dev_priv, 3640 fence_size = i915_gem_get_ggtt_size(dev_priv,
3639 obj->base.size, 3641 obj->base.size,
3640 obj->tiling_mode); 3642 i915_gem_object_get_tiling(obj));
3641 fence_alignment = i915_gem_get_ggtt_alignment(dev_priv, 3643 fence_alignment = i915_gem_get_ggtt_alignment(dev_priv,
3642 obj->base.size, 3644 obj->base.size,
3643 obj->tiling_mode, 3645 i915_gem_object_get_tiling(obj),
3644 true); 3646 true);
3645 3647
3646 fenceable = (vma->node.size == fence_size && 3648 fenceable = (vma->node.size == fence_size &&
@@ -3884,7 +3886,7 @@ i915_gem_madvise_ioctl(struct drm_device *dev, void *data,
3884 } 3886 }
3885 3887
3886 if (obj->pages && 3888 if (obj->pages &&
3887 obj->tiling_mode != I915_TILING_NONE && 3889 i915_gem_object_is_tiled(obj) &&
3888 dev_priv->quirks & QUIRK_PIN_SWIZZLED_PAGES) { 3890 dev_priv->quirks & QUIRK_PIN_SWIZZLED_PAGES) {
3889 if (obj->madv == I915_MADV_WILLNEED) 3891 if (obj->madv == I915_MADV_WILLNEED)
3890 i915_gem_object_unpin_pages(obj); 3892 i915_gem_object_unpin_pages(obj);
@@ -4054,7 +4056,7 @@ void i915_gem_free_object(struct drm_gem_object *gem_obj)
4054 4056
4055 if (obj->pages && obj->madv == I915_MADV_WILLNEED && 4057 if (obj->pages && obj->madv == I915_MADV_WILLNEED &&
4056 dev_priv->quirks & QUIRK_PIN_SWIZZLED_PAGES && 4058 dev_priv->quirks & QUIRK_PIN_SWIZZLED_PAGES &&
4057 obj->tiling_mode != I915_TILING_NONE) 4059 i915_gem_object_is_tiled(obj))
4058 i915_gem_object_unpin_pages(obj); 4060 i915_gem_object_unpin_pages(obj);
4059 4061
4060 if (WARN_ON(obj->pages_pin_count)) 4062 if (WARN_ON(obj->pages_pin_count))
diff --git a/drivers/gpu/drm/i915/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
index 71834741bd87..c494b79ded20 100644
--- a/drivers/gpu/drm/i915/i915_gem_execbuffer.c
+++ b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
@@ -803,7 +803,7 @@ i915_gem_execbuffer_reserve(struct intel_engine_cs *engine,
803 entry->flags &= ~EXEC_OBJECT_NEEDS_FENCE; 803 entry->flags &= ~EXEC_OBJECT_NEEDS_FENCE;
804 need_fence = 804 need_fence =
805 entry->flags & EXEC_OBJECT_NEEDS_FENCE && 805 entry->flags & EXEC_OBJECT_NEEDS_FENCE &&
806 obj->tiling_mode != I915_TILING_NONE; 806 i915_gem_object_is_tiled(obj);
807 need_mappable = need_fence || need_reloc_mappable(vma); 807 need_mappable = need_fence || need_reloc_mappable(vma);
808 808
809 if (entry->flags & EXEC_OBJECT_PINNED) 809 if (entry->flags & EXEC_OBJECT_PINNED)
diff --git a/drivers/gpu/drm/i915/i915_gem_fence.c b/drivers/gpu/drm/i915/i915_gem_fence.c
index 3b462da612ca..9e8173fe2a09 100644
--- a/drivers/gpu/drm/i915/i915_gem_fence.c
+++ b/drivers/gpu/drm/i915/i915_gem_fence.c
@@ -86,20 +86,22 @@ static void i965_write_fence_reg(struct drm_device *dev, int reg,
86 86
87 if (obj) { 87 if (obj) {
88 u32 size = i915_gem_obj_ggtt_size(obj); 88 u32 size = i915_gem_obj_ggtt_size(obj);
89 unsigned int tiling = i915_gem_object_get_tiling(obj);
90 unsigned int stride = i915_gem_object_get_stride(obj);
89 uint64_t val; 91 uint64_t val;
90 92
91 /* Adjust fence size to match tiled area */ 93 /* Adjust fence size to match tiled area */
92 if (obj->tiling_mode != I915_TILING_NONE) { 94 if (tiling != I915_TILING_NONE) {
93 uint32_t row_size = obj->stride * 95 uint32_t row_size = stride *
94 (obj->tiling_mode == I915_TILING_Y ? 32 : 8); 96 (tiling == I915_TILING_Y ? 32 : 8);
95 size = (size / row_size) * row_size; 97 size = (size / row_size) * row_size;
96 } 98 }
97 99
98 val = (uint64_t)((i915_gem_obj_ggtt_offset(obj) + size - 4096) & 100 val = (uint64_t)((i915_gem_obj_ggtt_offset(obj) + size - 4096) &
99 0xfffff000) << 32; 101 0xfffff000) << 32;
100 val |= i915_gem_obj_ggtt_offset(obj) & 0xfffff000; 102 val |= i915_gem_obj_ggtt_offset(obj) & 0xfffff000;
101 val |= (uint64_t)((obj->stride / 128) - 1) << fence_pitch_shift; 103 val |= (uint64_t)((stride / 128) - 1) << fence_pitch_shift;
102 if (obj->tiling_mode == I915_TILING_Y) 104 if (tiling == I915_TILING_Y)
103 val |= 1 << I965_FENCE_TILING_Y_SHIFT; 105 val |= 1 << I965_FENCE_TILING_Y_SHIFT;
104 val |= I965_FENCE_REG_VALID; 106 val |= I965_FENCE_REG_VALID;
105 107
@@ -122,6 +124,8 @@ static void i915_write_fence_reg(struct drm_device *dev, int reg,
122 124
123 if (obj) { 125 if (obj) {
124 u32 size = i915_gem_obj_ggtt_size(obj); 126 u32 size = i915_gem_obj_ggtt_size(obj);
127 unsigned int tiling = i915_gem_object_get_tiling(obj);
128 unsigned int stride = i915_gem_object_get_stride(obj);
125 int pitch_val; 129 int pitch_val;
126 int tile_width; 130 int tile_width;
127 131
@@ -131,17 +135,17 @@ static void i915_write_fence_reg(struct drm_device *dev, int reg,
131 "object 0x%08llx [fenceable? %d] not 1M or pot-size (0x%08x) aligned\n", 135 "object 0x%08llx [fenceable? %d] not 1M or pot-size (0x%08x) aligned\n",
132 i915_gem_obj_ggtt_offset(obj), obj->map_and_fenceable, size); 136 i915_gem_obj_ggtt_offset(obj), obj->map_and_fenceable, size);
133 137
134 if (obj->tiling_mode == I915_TILING_Y && HAS_128_BYTE_Y_TILING(dev)) 138 if (tiling == I915_TILING_Y && HAS_128_BYTE_Y_TILING(dev))
135 tile_width = 128; 139 tile_width = 128;
136 else 140 else
137 tile_width = 512; 141 tile_width = 512;
138 142
139 /* Note: pitch better be a power of two tile widths */ 143 /* Note: pitch better be a power of two tile widths */
140 pitch_val = obj->stride / tile_width; 144 pitch_val = stride / tile_width;
141 pitch_val = ffs(pitch_val) - 1; 145 pitch_val = ffs(pitch_val) - 1;
142 146
143 val = i915_gem_obj_ggtt_offset(obj); 147 val = i915_gem_obj_ggtt_offset(obj);
144 if (obj->tiling_mode == I915_TILING_Y) 148 if (tiling == I915_TILING_Y)
145 val |= 1 << I830_FENCE_TILING_Y_SHIFT; 149 val |= 1 << I830_FENCE_TILING_Y_SHIFT;
146 val |= I915_FENCE_SIZE_BITS(size); 150 val |= I915_FENCE_SIZE_BITS(size);
147 val |= pitch_val << I830_FENCE_PITCH_SHIFT; 151 val |= pitch_val << I830_FENCE_PITCH_SHIFT;
@@ -161,6 +165,8 @@ static void i830_write_fence_reg(struct drm_device *dev, int reg,
161 165
162 if (obj) { 166 if (obj) {
163 u32 size = i915_gem_obj_ggtt_size(obj); 167 u32 size = i915_gem_obj_ggtt_size(obj);
168 unsigned int tiling = i915_gem_object_get_tiling(obj);
169 unsigned int stride = i915_gem_object_get_stride(obj);
164 uint32_t pitch_val; 170 uint32_t pitch_val;
165 171
166 WARN((i915_gem_obj_ggtt_offset(obj) & ~I830_FENCE_START_MASK) || 172 WARN((i915_gem_obj_ggtt_offset(obj) & ~I830_FENCE_START_MASK) ||
@@ -169,11 +175,11 @@ static void i830_write_fence_reg(struct drm_device *dev, int reg,
169 "object 0x%08llx not 512K or pot-size 0x%08x aligned\n", 175 "object 0x%08llx not 512K or pot-size 0x%08x aligned\n",
170 i915_gem_obj_ggtt_offset(obj), size); 176 i915_gem_obj_ggtt_offset(obj), size);
171 177
172 pitch_val = obj->stride / 128; 178 pitch_val = stride / 128;
173 pitch_val = ffs(pitch_val) - 1; 179 pitch_val = ffs(pitch_val) - 1;
174 180
175 val = i915_gem_obj_ggtt_offset(obj); 181 val = i915_gem_obj_ggtt_offset(obj);
176 if (obj->tiling_mode == I915_TILING_Y) 182 if (tiling == I915_TILING_Y)
177 val |= 1 << I830_FENCE_TILING_Y_SHIFT; 183 val |= 1 << I830_FENCE_TILING_Y_SHIFT;
178 val |= I830_FENCE_SIZE_BITS(size); 184 val |= I830_FENCE_SIZE_BITS(size);
179 val |= pitch_val << I830_FENCE_PITCH_SHIFT; 185 val |= pitch_val << I830_FENCE_PITCH_SHIFT;
@@ -201,9 +207,12 @@ static void i915_gem_write_fence(struct drm_device *dev, int reg,
201 if (i915_gem_object_needs_mb(dev_priv->fence_regs[reg].obj)) 207 if (i915_gem_object_needs_mb(dev_priv->fence_regs[reg].obj))
202 mb(); 208 mb();
203 209
204 WARN(obj && (!obj->stride || !obj->tiling_mode), 210 WARN(obj &&
211 (!i915_gem_object_get_stride(obj) ||
212 !i915_gem_object_get_tiling(obj)),
205 "bogus fence setup with stride: 0x%x, tiling mode: %i\n", 213 "bogus fence setup with stride: 0x%x, tiling mode: %i\n",
206 obj->stride, obj->tiling_mode); 214 i915_gem_object_get_stride(obj),
215 i915_gem_object_get_tiling(obj));
207 216
208 if (IS_GEN2(dev)) 217 if (IS_GEN2(dev))
209 i830_write_fence_reg(dev, reg, obj); 218 i830_write_fence_reg(dev, reg, obj);
@@ -248,7 +257,7 @@ static void i915_gem_object_update_fence(struct drm_i915_gem_object *obj,
248 257
249static inline void i915_gem_object_fence_lost(struct drm_i915_gem_object *obj) 258static inline void i915_gem_object_fence_lost(struct drm_i915_gem_object *obj)
250{ 259{
251 if (obj->tiling_mode) 260 if (i915_gem_object_is_tiled(obj))
252 i915_gem_release_mmap(obj); 261 i915_gem_release_mmap(obj);
253 262
254 /* As we do not have an associated fence register, we will force 263 /* As we do not have an associated fence register, we will force
@@ -361,7 +370,7 @@ i915_gem_object_get_fence(struct drm_i915_gem_object *obj)
361{ 370{
362 struct drm_device *dev = obj->base.dev; 371 struct drm_device *dev = obj->base.dev;
363 struct drm_i915_private *dev_priv = to_i915(dev); 372 struct drm_i915_private *dev_priv = to_i915(dev);
364 bool enable = obj->tiling_mode != I915_TILING_NONE; 373 bool enable = i915_gem_object_is_tiled(obj);
365 struct drm_i915_fence_reg *reg; 374 struct drm_i915_fence_reg *reg;
366 int ret; 375 int ret;
367 376
@@ -477,7 +486,7 @@ void i915_gem_restore_fences(struct drm_device *dev)
477 */ 486 */
478 if (reg->obj) { 487 if (reg->obj) {
479 i915_gem_object_update_fence(reg->obj, reg, 488 i915_gem_object_update_fence(reg->obj, reg,
480 reg->obj->tiling_mode); 489 i915_gem_object_get_tiling(reg->obj));
481 } else { 490 } else {
482 i915_gem_write_fence(dev, i, NULL); 491 i915_gem_write_fence(dev, i, NULL);
483 } 492 }
diff --git a/drivers/gpu/drm/i915/i915_gem_tiling.c b/drivers/gpu/drm/i915/i915_gem_tiling.c
index 6817f69947d9..f4b984de83b5 100644
--- a/drivers/gpu/drm/i915/i915_gem_tiling.c
+++ b/drivers/gpu/drm/i915/i915_gem_tiling.c
@@ -170,6 +170,9 @@ i915_gem_set_tiling(struct drm_device *dev, void *data,
170 struct drm_i915_gem_object *obj; 170 struct drm_i915_gem_object *obj;
171 int ret = 0; 171 int ret = 0;
172 172
173 /* Make sure we don't cross-contaminate obj->tiling_and_stride */
174 BUILD_BUG_ON(I915_TILING_LAST & STRIDE_MASK);
175
173 obj = i915_gem_object_lookup(file, args->handle); 176 obj = i915_gem_object_lookup(file, args->handle);
174 if (!obj) 177 if (!obj)
175 return -ENOENT; 178 return -ENOENT;
@@ -217,8 +220,8 @@ i915_gem_set_tiling(struct drm_device *dev, void *data,
217 } 220 }
218 } 221 }
219 222
220 if (args->tiling_mode != obj->tiling_mode || 223 if (args->tiling_mode != i915_gem_object_get_tiling(obj) ||
221 args->stride != obj->stride) { 224 args->stride != i915_gem_object_get_stride(obj)) {
222 /* We need to rebind the object if its current allocation 225 /* We need to rebind the object if its current allocation
223 * no longer meets the alignment restrictions for its new 226 * no longer meets the alignment restrictions for its new
224 * tiling mode. Otherwise we can just leave it alone, but 227 * tiling mode. Otherwise we can just leave it alone, but
@@ -241,7 +244,7 @@ i915_gem_set_tiling(struct drm_device *dev, void *data,
241 dev_priv->quirks & QUIRK_PIN_SWIZZLED_PAGES) { 244 dev_priv->quirks & QUIRK_PIN_SWIZZLED_PAGES) {
242 if (args->tiling_mode == I915_TILING_NONE) 245 if (args->tiling_mode == I915_TILING_NONE)
243 i915_gem_object_unpin_pages(obj); 246 i915_gem_object_unpin_pages(obj);
244 if (obj->tiling_mode == I915_TILING_NONE) 247 if (!i915_gem_object_is_tiled(obj))
245 i915_gem_object_pin_pages(obj); 248 i915_gem_object_pin_pages(obj);
246 } 249 }
247 250
@@ -250,16 +253,16 @@ i915_gem_set_tiling(struct drm_device *dev, void *data,
250 &dev->struct_mutex) || 253 &dev->struct_mutex) ||
251 obj->fence_reg != I915_FENCE_REG_NONE; 254 obj->fence_reg != I915_FENCE_REG_NONE;
252 255
253 obj->tiling_mode = args->tiling_mode; 256 obj->tiling_and_stride =
254 obj->stride = args->stride; 257 args->stride | args->tiling_mode;
255 258
256 /* Force the fence to be reacquired for GTT access */ 259 /* Force the fence to be reacquired for GTT access */
257 i915_gem_release_mmap(obj); 260 i915_gem_release_mmap(obj);
258 } 261 }
259 } 262 }
260 /* we have to maintain this existing ABI... */ 263 /* we have to maintain this existing ABI... */
261 args->stride = obj->stride; 264 args->stride = i915_gem_object_get_stride(obj);
262 args->tiling_mode = obj->tiling_mode; 265 args->tiling_mode = i915_gem_object_get_tiling(obj);
263 266
264 /* Try to preallocate memory required to save swizzling on put-pages */ 267 /* Try to preallocate memory required to save swizzling on put-pages */
265 if (i915_gem_object_needs_bit17_swizzle(obj)) { 268 if (i915_gem_object_needs_bit17_swizzle(obj)) {
@@ -306,7 +309,7 @@ i915_gem_get_tiling(struct drm_device *dev, void *data,
306 if (!obj) 309 if (!obj)
307 return -ENOENT; 310 return -ENOENT;
308 311
309 args->tiling_mode = READ_ONCE(obj->tiling_mode); 312 args->tiling_mode = READ_ONCE(obj->tiling_and_stride) & TILING_MASK;
310 switch (args->tiling_mode) { 313 switch (args->tiling_mode) {
311 case I915_TILING_X: 314 case I915_TILING_X:
312 args->swizzle_mode = dev_priv->mm.bit_6_swizzle_x; 315 args->swizzle_mode = dev_priv->mm.bit_6_swizzle_x;
diff --git a/drivers/gpu/drm/i915/i915_gpu_error.c b/drivers/gpu/drm/i915/i915_gpu_error.c
index cc28ad429dd8..eecb87063c88 100644
--- a/drivers/gpu/drm/i915/i915_gpu_error.c
+++ b/drivers/gpu/drm/i915/i915_gpu_error.c
@@ -781,7 +781,7 @@ static void capture_bo(struct drm_i915_error_buffer *err,
781 err->pinned = 0; 781 err->pinned = 0;
782 if (i915_gem_obj_is_pinned(obj)) 782 if (i915_gem_obj_is_pinned(obj))
783 err->pinned = 1; 783 err->pinned = 1;
784 err->tiling = obj->tiling_mode; 784 err->tiling = i915_gem_object_get_tiling(obj);
785 err->dirty = obj->dirty; 785 err->dirty = obj->dirty;
786 err->purgeable = obj->madv != I915_MADV_WILLNEED; 786 err->purgeable = obj->madv != I915_MADV_WILLNEED;
787 err->userptr = obj->userptr.mm != NULL; 787 err->userptr = obj->userptr.mm != NULL;
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index 9068676943bf..9cbf5431c1e3 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -2466,9 +2466,8 @@ intel_alloc_initial_plane_obj(struct intel_crtc *crtc,
2466 return false; 2466 return false;
2467 } 2467 }
2468 2468
2469 obj->tiling_mode = plane_config->tiling; 2469 if (plane_config->tiling == I915_TILING_X)
2470 if (obj->tiling_mode == I915_TILING_X) 2470 obj->tiling_and_stride = fb->pitches[0] | I915_TILING_X;
2471 obj->stride = fb->pitches[0];
2472 2471
2473 mode_cmd.pixel_format = fb->pixel_format; 2472 mode_cmd.pixel_format = fb->pixel_format;
2474 mode_cmd.width = fb->width; 2473 mode_cmd.width = fb->width;
@@ -2594,7 +2593,7 @@ valid_fb:
2594 intel_state->dst.y2 = plane_state->crtc_y + plane_state->crtc_h; 2593 intel_state->dst.y2 = plane_state->crtc_y + plane_state->crtc_h;
2595 2594
2596 obj = intel_fb_obj(fb); 2595 obj = intel_fb_obj(fb);
2597 if (obj->tiling_mode != I915_TILING_NONE) 2596 if (i915_gem_object_is_tiled(obj))
2598 dev_priv->preserve_bios_swizzle = true; 2597 dev_priv->preserve_bios_swizzle = true;
2599 2598
2600 drm_framebuffer_reference(fb); 2599 drm_framebuffer_reference(fb);
@@ -2672,8 +2671,7 @@ static void i9xx_update_primary_plane(struct drm_plane *primary,
2672 BUG(); 2671 BUG();
2673 } 2672 }
2674 2673
2675 if (INTEL_INFO(dev)->gen >= 4 && 2674 if (INTEL_INFO(dev)->gen >= 4 && i915_gem_object_is_tiled(obj))
2676 obj->tiling_mode != I915_TILING_NONE)
2677 dspcntr |= DISPPLANE_TILED; 2675 dspcntr |= DISPPLANE_TILED;
2678 2676
2679 if (IS_G4X(dev)) 2677 if (IS_G4X(dev))
@@ -2782,7 +2780,7 @@ static void ironlake_update_primary_plane(struct drm_plane *primary,
2782 BUG(); 2780 BUG();
2783 } 2781 }
2784 2782
2785 if (obj->tiling_mode != I915_TILING_NONE) 2783 if (i915_gem_object_is_tiled(obj))
2786 dspcntr |= DISPPLANE_TILED; 2784 dspcntr |= DISPPLANE_TILED;
2787 2785
2788 if (!IS_HASWELL(dev) && !IS_BROADWELL(dev)) 2786 if (!IS_HASWELL(dev) && !IS_BROADWELL(dev))
@@ -11200,7 +11198,7 @@ static int intel_gen4_queue_flip(struct drm_device *dev,
11200 MI_DISPLAY_FLIP_PLANE(intel_crtc->plane)); 11198 MI_DISPLAY_FLIP_PLANE(intel_crtc->plane));
11201 intel_ring_emit(ring, fb->pitches[0]); 11199 intel_ring_emit(ring, fb->pitches[0]);
11202 intel_ring_emit(ring, intel_crtc->flip_work->gtt_offset | 11200 intel_ring_emit(ring, intel_crtc->flip_work->gtt_offset |
11203 obj->tiling_mode); 11201 i915_gem_object_get_tiling(obj));
11204 11202
11205 /* XXX Enabling the panel-fitter across page-flip is so far 11203 /* XXX Enabling the panel-fitter across page-flip is so far
11206 * untested on non-native modes, so ignore it for now. 11204 * untested on non-native modes, so ignore it for now.
@@ -11232,7 +11230,7 @@ static int intel_gen6_queue_flip(struct drm_device *dev,
11232 11230
11233 intel_ring_emit(ring, MI_DISPLAY_FLIP | 11231 intel_ring_emit(ring, MI_DISPLAY_FLIP |
11234 MI_DISPLAY_FLIP_PLANE(intel_crtc->plane)); 11232 MI_DISPLAY_FLIP_PLANE(intel_crtc->plane));
11235 intel_ring_emit(ring, fb->pitches[0] | obj->tiling_mode); 11233 intel_ring_emit(ring, fb->pitches[0] | i915_gem_object_get_tiling(obj));
11236 intel_ring_emit(ring, intel_crtc->flip_work->gtt_offset); 11234 intel_ring_emit(ring, intel_crtc->flip_work->gtt_offset);
11237 11235
11238 /* Contrary to the suggestions in the documentation, 11236 /* Contrary to the suggestions in the documentation,
@@ -11335,7 +11333,7 @@ static int intel_gen7_queue_flip(struct drm_device *dev,
11335 } 11333 }
11336 11334
11337 intel_ring_emit(ring, MI_DISPLAY_FLIP_I915 | plane_bit); 11335 intel_ring_emit(ring, MI_DISPLAY_FLIP_I915 | plane_bit);
11338 intel_ring_emit(ring, (fb->pitches[0] | obj->tiling_mode)); 11336 intel_ring_emit(ring, fb->pitches[0] | i915_gem_object_get_tiling(obj));
11339 intel_ring_emit(ring, intel_crtc->flip_work->gtt_offset); 11337 intel_ring_emit(ring, intel_crtc->flip_work->gtt_offset);
11340 intel_ring_emit(ring, (MI_NOOP)); 11338 intel_ring_emit(ring, (MI_NOOP));
11341 11339
@@ -11442,7 +11440,7 @@ static void ilk_do_mmio_flip(struct intel_crtc *intel_crtc,
11442 11440
11443 dspcntr = I915_READ(reg); 11441 dspcntr = I915_READ(reg);
11444 11442
11445 if (obj->tiling_mode != I915_TILING_NONE) 11443 if (i915_gem_object_is_tiled(obj))
11446 dspcntr |= DISPPLANE_TILED; 11444 dspcntr |= DISPPLANE_TILED;
11447 else 11445 else
11448 dspcntr &= ~DISPPLANE_TILED; 11446 dspcntr &= ~DISPPLANE_TILED;
@@ -11670,7 +11668,8 @@ static int intel_crtc_page_flip(struct drm_crtc *crtc,
11670 11668
11671 if (IS_VALLEYVIEW(dev) || IS_CHERRYVIEW(dev)) { 11669 if (IS_VALLEYVIEW(dev) || IS_CHERRYVIEW(dev)) {
11672 engine = &dev_priv->engine[BCS]; 11670 engine = &dev_priv->engine[BCS];
11673 if (obj->tiling_mode != intel_fb_obj(work->old_fb)->tiling_mode) 11671 if (i915_gem_object_get_tiling(obj) !=
11672 i915_gem_object_get_tiling(intel_fb_obj(work->old_fb)))
11674 /* vlv: DISPLAY_FLIP fails to change tiling */ 11673 /* vlv: DISPLAY_FLIP fails to change tiling */
11675 engine = NULL; 11674 engine = NULL;
11676 } else if (IS_IVYBRIDGE(dev) || IS_HASWELL(dev)) { 11675 } else if (IS_IVYBRIDGE(dev) || IS_HASWELL(dev)) {
@@ -14932,15 +14931,15 @@ static int intel_framebuffer_init(struct drm_device *dev,
14932 if (mode_cmd->flags & DRM_MODE_FB_MODIFIERS) { 14931 if (mode_cmd->flags & DRM_MODE_FB_MODIFIERS) {
14933 /* Enforce that fb modifier and tiling mode match, but only for 14932 /* Enforce that fb modifier and tiling mode match, but only for
14934 * X-tiled. This is needed for FBC. */ 14933 * X-tiled. This is needed for FBC. */
14935 if (!!(obj->tiling_mode == I915_TILING_X) != 14934 if (!!(i915_gem_object_get_tiling(obj) == I915_TILING_X) !=
14936 !!(mode_cmd->modifier[0] == I915_FORMAT_MOD_X_TILED)) { 14935 !!(mode_cmd->modifier[0] == I915_FORMAT_MOD_X_TILED)) {
14937 DRM_DEBUG("tiling_mode doesn't match fb modifier\n"); 14936 DRM_DEBUG("tiling_mode doesn't match fb modifier\n");
14938 return -EINVAL; 14937 return -EINVAL;
14939 } 14938 }
14940 } else { 14939 } else {
14941 if (obj->tiling_mode == I915_TILING_X) 14940 if (i915_gem_object_get_tiling(obj) == I915_TILING_X)
14942 mode_cmd->modifier[0] = I915_FORMAT_MOD_X_TILED; 14941 mode_cmd->modifier[0] = I915_FORMAT_MOD_X_TILED;
14943 else if (obj->tiling_mode == I915_TILING_Y) { 14942 else if (i915_gem_object_get_tiling(obj) == I915_TILING_Y) {
14944 DRM_DEBUG("No Y tiling for legacy addfb\n"); 14943 DRM_DEBUG("No Y tiling for legacy addfb\n");
14945 return -EINVAL; 14944 return -EINVAL;
14946 } 14945 }
@@ -14984,9 +14983,10 @@ static int intel_framebuffer_init(struct drm_device *dev,
14984 } 14983 }
14985 14984
14986 if (mode_cmd->modifier[0] == I915_FORMAT_MOD_X_TILED && 14985 if (mode_cmd->modifier[0] == I915_FORMAT_MOD_X_TILED &&
14987 mode_cmd->pitches[0] != obj->stride) { 14986 mode_cmd->pitches[0] != i915_gem_object_get_stride(obj)) {
14988 DRM_DEBUG("pitch (%d) must match tiling stride (%d)\n", 14987 DRM_DEBUG("pitch (%d) must match tiling stride (%d)\n",
14989 mode_cmd->pitches[0], obj->stride); 14988 mode_cmd->pitches[0],
14989 i915_gem_object_get_stride(obj));
14990 return -EINVAL; 14990 return -EINVAL;
14991 } 14991 }
14992 14992
diff --git a/drivers/gpu/drm/i915/intel_fbc.c b/drivers/gpu/drm/i915/intel_fbc.c
index d4be07615aa9..85adc2b92594 100644
--- a/drivers/gpu/drm/i915/intel_fbc.c
+++ b/drivers/gpu/drm/i915/intel_fbc.c
@@ -741,7 +741,7 @@ static void intel_fbc_update_state_cache(struct intel_crtc *crtc,
741 cache->fb.pixel_format = fb->pixel_format; 741 cache->fb.pixel_format = fb->pixel_format;
742 cache->fb.stride = fb->pitches[0]; 742 cache->fb.stride = fb->pitches[0];
743 cache->fb.fence_reg = obj->fence_reg; 743 cache->fb.fence_reg = obj->fence_reg;
744 cache->fb.tiling_mode = obj->tiling_mode; 744 cache->fb.tiling_mode = i915_gem_object_get_tiling(obj);
745} 745}
746 746
747static bool intel_fbc_can_activate(struct intel_crtc *crtc) 747static bool intel_fbc_can_activate(struct intel_crtc *crtc)
diff --git a/drivers/gpu/drm/i915/intel_overlay.c b/drivers/gpu/drm/i915/intel_overlay.c
index 413a2038e6d1..90f3ab424e01 100644
--- a/drivers/gpu/drm/i915/intel_overlay.c
+++ b/drivers/gpu/drm/i915/intel_overlay.c
@@ -1129,7 +1129,7 @@ int intel_overlay_put_image_ioctl(struct drm_device *dev, void *data,
1129 drm_modeset_lock_all(dev); 1129 drm_modeset_lock_all(dev);
1130 mutex_lock(&dev->struct_mutex); 1130 mutex_lock(&dev->struct_mutex);
1131 1131
1132 if (new_bo->tiling_mode) { 1132 if (i915_gem_object_is_tiled(new_bo)) {
1133 DRM_DEBUG_KMS("buffer used for overlay image can not be tiled\n"); 1133 DRM_DEBUG_KMS("buffer used for overlay image can not be tiled\n");
1134 ret = -EINVAL; 1134 ret = -EINVAL;
1135 goto out_unlock; 1135 goto out_unlock;
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
index eedcacef7d5c..aef0b105eb58 100644
--- a/drivers/gpu/drm/i915/intel_pm.c
+++ b/drivers/gpu/drm/i915/intel_pm.c
@@ -1585,7 +1585,7 @@ static void i9xx_update_wm(struct drm_crtc *unused_crtc)
1585 obj = intel_fb_obj(enabled->primary->state->fb); 1585 obj = intel_fb_obj(enabled->primary->state->fb);
1586 1586
1587 /* self-refresh seems busted with untiled */ 1587 /* self-refresh seems busted with untiled */
1588 if (obj->tiling_mode == I915_TILING_NONE) 1588 if (!i915_gem_object_is_tiled(obj))
1589 enabled = NULL; 1589 enabled = NULL;
1590 } 1590 }
1591 1591
diff --git a/drivers/gpu/drm/i915/intel_sprite.c b/drivers/gpu/drm/i915/intel_sprite.c
index e045295ef4af..9ed7ad32cffd 100644
--- a/drivers/gpu/drm/i915/intel_sprite.c
+++ b/drivers/gpu/drm/i915/intel_sprite.c
@@ -431,7 +431,7 @@ vlv_update_plane(struct drm_plane *dplane,
431 */ 431 */
432 sprctl |= SP_GAMMA_ENABLE; 432 sprctl |= SP_GAMMA_ENABLE;
433 433
434 if (obj->tiling_mode != I915_TILING_NONE) 434 if (i915_gem_object_is_tiled(obj))
435 sprctl |= SP_TILED; 435 sprctl |= SP_TILED;
436 436
437 /* Sizes are 0 based */ 437 /* Sizes are 0 based */
@@ -468,7 +468,7 @@ vlv_update_plane(struct drm_plane *dplane,
468 I915_WRITE(SPSTRIDE(pipe, plane), fb->pitches[0]); 468 I915_WRITE(SPSTRIDE(pipe, plane), fb->pitches[0]);
469 I915_WRITE(SPPOS(pipe, plane), (crtc_y << 16) | crtc_x); 469 I915_WRITE(SPPOS(pipe, plane), (crtc_y << 16) | crtc_x);
470 470
471 if (obj->tiling_mode != I915_TILING_NONE) 471 if (i915_gem_object_is_tiled(obj))
472 I915_WRITE(SPTILEOFF(pipe, plane), (y << 16) | x); 472 I915_WRITE(SPTILEOFF(pipe, plane), (y << 16) | x);
473 else 473 else
474 I915_WRITE(SPLINOFF(pipe, plane), linear_offset); 474 I915_WRITE(SPLINOFF(pipe, plane), linear_offset);
@@ -553,7 +553,7 @@ ivb_update_plane(struct drm_plane *plane,
553 */ 553 */
554 sprctl |= SPRITE_GAMMA_ENABLE; 554 sprctl |= SPRITE_GAMMA_ENABLE;
555 555
556 if (obj->tiling_mode != I915_TILING_NONE) 556 if (i915_gem_object_is_tiled(obj))
557 sprctl |= SPRITE_TILED; 557 sprctl |= SPRITE_TILED;
558 558
559 if (IS_HASWELL(dev) || IS_BROADWELL(dev)) 559 if (IS_HASWELL(dev) || IS_BROADWELL(dev))
@@ -607,7 +607,7 @@ ivb_update_plane(struct drm_plane *plane,
607 * register */ 607 * register */
608 if (IS_HASWELL(dev) || IS_BROADWELL(dev)) 608 if (IS_HASWELL(dev) || IS_BROADWELL(dev))
609 I915_WRITE(SPROFFSET(pipe), (y << 16) | x); 609 I915_WRITE(SPROFFSET(pipe), (y << 16) | x);
610 else if (obj->tiling_mode != I915_TILING_NONE) 610 else if (i915_gem_object_is_tiled(obj))
611 I915_WRITE(SPRTILEOFF(pipe), (y << 16) | x); 611 I915_WRITE(SPRTILEOFF(pipe), (y << 16) | x);
612 else 612 else
613 I915_WRITE(SPRLINOFF(pipe), linear_offset); 613 I915_WRITE(SPRLINOFF(pipe), linear_offset);
@@ -694,7 +694,7 @@ ilk_update_plane(struct drm_plane *plane,
694 */ 694 */
695 dvscntr |= DVS_GAMMA_ENABLE; 695 dvscntr |= DVS_GAMMA_ENABLE;
696 696
697 if (obj->tiling_mode != I915_TILING_NONE) 697 if (i915_gem_object_is_tiled(obj))
698 dvscntr |= DVS_TILED; 698 dvscntr |= DVS_TILED;
699 699
700 if (IS_GEN6(dev)) 700 if (IS_GEN6(dev))
@@ -737,7 +737,7 @@ ilk_update_plane(struct drm_plane *plane,
737 I915_WRITE(DVSSTRIDE(pipe), fb->pitches[0]); 737 I915_WRITE(DVSSTRIDE(pipe), fb->pitches[0]);
738 I915_WRITE(DVSPOS(pipe), (crtc_y << 16) | crtc_x); 738 I915_WRITE(DVSPOS(pipe), (crtc_y << 16) | crtc_x);
739 739
740 if (obj->tiling_mode != I915_TILING_NONE) 740 if (i915_gem_object_is_tiled(obj))
741 I915_WRITE(DVSTILEOFF(pipe), (y << 16) | x); 741 I915_WRITE(DVSTILEOFF(pipe), (y << 16) | x);
742 else 742 else
743 I915_WRITE(DVSLINOFF(pipe), linear_offset); 743 I915_WRITE(DVSLINOFF(pipe), linear_offset);