236,9 → 236,12 |
tile_width = 512; |
|
/* check maximum stride & object size */ |
if (INTEL_INFO(dev)->gen >= 4) { |
/* i965 stores the end address of the gtt mapping in the fence |
/* i965+ stores the end address of the gtt mapping in the fence |
* reg, so dont bother to check the size */ |
if (INTEL_INFO(dev)->gen >= 7) { |
if (stride / 128 > GEN7_FENCE_MAX_PITCH_VAL) |
return false; |
} else if (INTEL_INFO(dev)->gen >= 4) { |
if (stride / 128 > I965_FENCE_MAX_PITCH_VAL) |
return false; |
} else { |
254,6 → 257,9 |
} |
} |
|
if (stride < tile_width) |
return false; |
|
/* 965+ just needs multiples of tile width */ |
if (INTEL_INFO(dev)->gen >= 4) { |
if (stride & (tile_width - 1)) |
262,9 → 268,6 |
} |
|
/* Pre-965 needs power of two tile widths */ |
if (stride < tile_width) |
return false; |
|
if (stride & (stride - 1)) |
return false; |
|
492,15 → 495,15 |
void |
i915_gem_object_do_bit_17_swizzle(struct drm_i915_gem_object *obj) |
{ |
struct scatterlist *sg; |
int page_count = obj->base.size >> PAGE_SHIFT; |
struct sg_page_iter sg_iter; |
int i; |
|
if (obj->bit_17 == NULL) |
return; |
|
for_each_sg(obj->pages->sgl, sg, page_count, i) { |
struct page *page = sg_page(sg); |
i = 0; |
for_each_sg_page(obj->pages->sgl, &sg_iter, obj->pages->nents, 0) { |
struct page *page = sg_page_iter_page(&sg_iter); |
char new_bit_17 = page_to_phys(page) >> 17; |
if ((new_bit_17 & 0x1) != |
(test_bit(i, obj->bit_17) != 0)) { |
507,6 → 510,7 |
i915_gem_swizzle_page(page); |
set_page_dirty(page); |
} |
i++; |
} |
} |
|
513,7 → 517,7 |
void |
i915_gem_object_save_bit_17_swizzle(struct drm_i915_gem_object *obj) |
{ |
struct scatterlist *sg; |
struct sg_page_iter sg_iter; |
int page_count = obj->base.size >> PAGE_SHIFT; |
int i; |
|
527,12 → 531,13 |
} |
} |
|
for_each_sg(obj->pages->sgl, sg, page_count, i) { |
struct page *page = sg_page(sg); |
if (page_to_phys(page) & (1 << 17)) |
i = 0; |
for_each_sg_page(obj->pages->sgl, &sg_iter, obj->pages->nents, 0) { |
if (page_to_phys(sg_page_iter_page(&sg_iter)) & (1 << 17)) |
__set_bit(i, obj->bit_17); |
else |
__clear_bit(i, obj->bit_17); |
i++; |
} |
} |
|