Rev 3480 | Rev 4104 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 3480 | Rev 3746 | ||
---|---|---|---|
Line 234... | Line 234... | ||
234 | tile_width = 128; |
234 | tile_width = 128; |
235 | else |
235 | else |
236 | tile_width = 512; |
236 | tile_width = 512; |
Line 237... | Line 237... | ||
237 | 237 | ||
238 | /* check maximum stride & object size */ |
- | |
239 | if (INTEL_INFO(dev)->gen >= 4) { |
238 | /* check maximum stride & object size */ |
240 | /* i965 stores the end address of the gtt mapping in the fence |
239 | /* i965+ stores the end address of the gtt mapping in the fence |
- | 240 | * reg, so dont bother to check the size */ |
|
- | 241 | if (INTEL_INFO(dev)->gen >= 7) { |
|
- | 242 | if (stride / 128 > GEN7_FENCE_MAX_PITCH_VAL) |
|
- | 243 | return false; |
|
241 | * reg, so dont bother to check the size */ |
244 | } else if (INTEL_INFO(dev)->gen >= 4) { |
242 | if (stride / 128 > I965_FENCE_MAX_PITCH_VAL) |
245 | if (stride / 128 > I965_FENCE_MAX_PITCH_VAL) |
243 | return false; |
246 | return false; |
244 | } else { |
247 | } else { |
245 | if (stride > 8192) |
248 | if (stride > 8192) |
Line 252... | Line 255... | ||
252 | if (size > I830_FENCE_MAX_SIZE_VAL << 19) |
255 | if (size > I830_FENCE_MAX_SIZE_VAL << 19) |
253 | return false; |
256 | return false; |
254 | } |
257 | } |
255 | } |
258 | } |
Line -... | Line 259... | ||
- | 259 | ||
- | 260 | if (stride < tile_width) |
|
- | 261 | return false; |
|
256 | 262 | ||
257 | /* 965+ just needs multiples of tile width */ |
263 | /* 965+ just needs multiples of tile width */ |
258 | if (INTEL_INFO(dev)->gen >= 4) { |
264 | if (INTEL_INFO(dev)->gen >= 4) { |
259 | if (stride & (tile_width - 1)) |
265 | if (stride & (tile_width - 1)) |
260 | return false; |
266 | return false; |
261 | return true; |
267 | return true; |
Line 262... | Line 268... | ||
262 | } |
268 | } |
263 | - | ||
264 | /* Pre-965 needs power of two tile widths */ |
- | |
265 | if (stride < tile_width) |
- | |
266 | return false; |
269 | |
267 | 270 | /* Pre-965 needs power of two tile widths */ |
|
Line 268... | Line 271... | ||
268 | if (stride & (stride - 1)) |
271 | if (stride & (stride - 1)) |
269 | return false; |
272 | return false; |
Line 490... | Line 493... | ||
490 | } |
493 | } |
Line 491... | Line 494... | ||
491 | 494 | ||
492 | void |
495 | void |
493 | i915_gem_object_do_bit_17_swizzle(struct drm_i915_gem_object *obj) |
496 | i915_gem_object_do_bit_17_swizzle(struct drm_i915_gem_object *obj) |
494 | { |
497 | { |
495 | struct scatterlist *sg; |
- | |
496 | int page_count = obj->base.size >> PAGE_SHIFT; |
498 | struct sg_page_iter sg_iter; |
Line 497... | Line 499... | ||
497 | int i; |
499 | int i; |
498 | 500 | ||
Line -... | Line 501... | ||
- | 501 | if (obj->bit_17 == NULL) |
|
499 | if (obj->bit_17 == NULL) |
502 | return; |
500 | return; |
503 | |
501 | 504 | i = 0; |
|
502 | for_each_sg(obj->pages->sgl, sg, page_count, i) { |
505 | for_each_sg_page(obj->pages->sgl, &sg_iter, obj->pages->nents, 0) { |
503 | struct page *page = sg_page(sg); |
506 | struct page *page = sg_page_iter_page(&sg_iter); |
504 | char new_bit_17 = page_to_phys(page) >> 17; |
507 | char new_bit_17 = page_to_phys(page) >> 17; |
505 | if ((new_bit_17 & 0x1) != |
508 | if ((new_bit_17 & 0x1) != |
506 | (test_bit(i, obj->bit_17) != 0)) { |
509 | (test_bit(i, obj->bit_17) != 0)) { |
- | 510 | i915_gem_swizzle_page(page); |
|
507 | i915_gem_swizzle_page(page); |
511 | set_page_dirty(page); |
508 | set_page_dirty(page); |
512 | } |
Line 509... | Line 513... | ||
509 | } |
513 | i++; |
510 | } |
514 | } |
511 | } |
515 | } |
512 | 516 | ||
513 | void |
517 | void |
514 | i915_gem_object_save_bit_17_swizzle(struct drm_i915_gem_object *obj) |
518 | i915_gem_object_save_bit_17_swizzle(struct drm_i915_gem_object *obj) |
Line 515... | Line 519... | ||
515 | { |
519 | { |
516 | struct scatterlist *sg; |
520 | struct sg_page_iter sg_iter; |
Line 525... | Line 529... | ||
525 | "record\n"); |
529 | "record\n"); |
526 | return; |
530 | return; |
527 | } |
531 | } |
528 | } |
532 | } |
Line -... | Line 533... | ||
- | 533 | ||
529 | 534 | i = 0; |
|
530 | for_each_sg(obj->pages->sgl, sg, page_count, i) { |
- | |
531 | struct page *page = sg_page(sg); |
535 | for_each_sg_page(obj->pages->sgl, &sg_iter, obj->pages->nents, 0) { |
532 | if (page_to_phys(page) & (1 << 17)) |
536 | if (page_to_phys(sg_page_iter_page(&sg_iter)) & (1 << 17)) |
533 | __set_bit(i, obj->bit_17); |
537 | __set_bit(i, obj->bit_17); |
534 | else |
538 | else |
- | 539 | __clear_bit(i, obj->bit_17); |
|
535 | __clear_bit(i, obj->bit_17); |
540 | i++; |
536 | } |
541 | } |
Line 537... | Line 542... | ||
537 | } |
542 | } |