Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/i915: Replace 4096 with PAGE_SIZE or I915_GTT_PAGE_SIZE

Start converting over from the byte count to its semantic macro, either
we want to allocate the size of a physical page in main memory or we
want the size of a virtual page in the GTT. 4096 could mean either, but
PAGE_SIZE and I915_GTT_PAGE_SIZE are explicit and should help improve
code comprehension and future changes. In the future, we may want to use
variable GTT page sizes and so have the challenge of knowing which
hardcoded values were used to represent a physical page vs the virtual
page.

v2: Look for a few more 4096s to convert, discover IS_ALIGNED().
v3: 4096ul paranoia, make fence alignment a distinct value of 4096, keep
bdw stolen w/a as 4096 until we know better.
v4: Add asserts that i915_vma_insert() start/end are aligned to GTT page
sizes.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Link: http://patchwork.freedesktop.org/patch/msgid/20170110144734.26052-1-chris@chris-wilson.co.uk
Reviewed-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>

+62 -45
+1 -1
drivers/gpu/drm/i915/i915_gem.c
··· 3496 3496 return; 3497 3497 3498 3498 if (--vma->obj->pin_display == 0) 3499 - vma->display_alignment = 4096; 3499 + vma->display_alignment = I915_GTT_MIN_ALIGNMENT; 3500 3500 3501 3501 /* Bump the LRU to try and avoid premature eviction whilst flipping */ 3502 3502 if (!i915_vma_is_active(vma))
+4 -3
drivers/gpu/drm/i915/i915_gem_context.c
··· 97 97 * part. It should be safe to decrease this, but it's more future proof as is. 98 98 */ 99 99 #define GEN6_CONTEXT_ALIGN (64<<10) 100 - #define GEN7_CONTEXT_ALIGN 4096 100 + #define GEN7_CONTEXT_ALIGN I915_GTT_MIN_ALIGNMENT 101 101 102 102 static size_t get_context_alignment(struct drm_i915_private *dev_priv) 103 103 { ··· 341 341 if (HAS_GUC(dev_priv) && i915.enable_guc_loading) 342 342 ctx->ggtt_offset_bias = GUC_WOPCM_TOP; 343 343 else 344 - ctx->ggtt_offset_bias = 4096; 344 + ctx->ggtt_offset_bias = I915_GTT_PAGE_SIZE; 345 345 346 346 return ctx; 347 347 ··· 456 456 dev_priv->hw_context_size = 0; 457 457 } else if (HAS_HW_CONTEXTS(dev_priv)) { 458 458 dev_priv->hw_context_size = 459 - round_up(get_context_size(dev_priv), 4096); 459 + round_up(get_context_size(dev_priv), 460 + I915_GTT_PAGE_SIZE); 460 461 if (dev_priv->hw_context_size > (1<<20)) { 461 462 DRM_DEBUG_DRIVER("Disabling HW Contexts; invalid size %d\n", 462 463 dev_priv->hw_context_size);
+2 -2
drivers/gpu/drm/i915/i915_gem_evict.c
··· 264 264 if (check_color) { 265 265 /* Expand search to cover neighbouring guard pages (or lack!) */ 266 266 if (start > target->vm->start) 267 - start -= 4096; 267 + start -= I915_GTT_PAGE_SIZE; 268 268 if (end < target->vm->start + target->vm->total) 269 - end += 4096; 269 + end += I915_GTT_PAGE_SIZE; 270 270 } 271 271 272 272 drm_mm_for_each_node_in_range(node, &target->vm->mm, start, end) {
+2 -3
drivers/gpu/drm/i915/i915_gem_execbuffer.c
··· 438 438 memset(&cache->node, 0, sizeof(cache->node)); 439 439 ret = drm_mm_insert_node_in_range_generic 440 440 (&ggtt->base.mm, &cache->node, 441 - 4096, 0, I915_COLOR_UNEVICTABLE, 441 + PAGE_SIZE, 0, I915_COLOR_UNEVICTABLE, 442 442 0, ggtt->mappable_end, 443 443 DRM_MM_SEARCH_DEFAULT, 444 444 DRM_MM_CREATE_DEFAULT); ··· 851 851 WARN_ON(entry->flags & __EXEC_OBJECT_NEEDS_MAP && 852 852 !i915_vma_is_ggtt(vma)); 853 853 854 - if (entry->alignment && 855 - vma->node.start & (entry->alignment - 1)) 854 + if (entry->alignment && !IS_ALIGNED(vma->node.start, entry->alignment)) 856 855 return true; 857 856 858 857 if (vma->node.size < entry->pad_to_size)
+6 -6
drivers/gpu/drm/i915/i915_gem_fence_reg.c
··· 80 80 unsigned int stride = i915_gem_object_get_stride(vma->obj); 81 81 82 82 GEM_BUG_ON(!i915_vma_is_map_and_fenceable(vma)); 83 - GEM_BUG_ON(vma->node.start & 4095); 84 - GEM_BUG_ON(vma->fence_size & 4095); 85 - GEM_BUG_ON(stride & 127); 83 + GEM_BUG_ON(!IS_ALIGNED(vma->node.start, I965_FENCE_PAGE)); 84 + GEM_BUG_ON(!IS_ALIGNED(vma->fence_size, I965_FENCE_PAGE)); 85 + GEM_BUG_ON(!IS_ALIGNED(stride, 128)); 86 86 87 - val = (vma->node.start + vma->fence_size - 4096) << 32; 87 + val = (vma->node.start + vma->fence_size - I965_FENCE_PAGE) << 32; 88 88 val |= vma->node.start; 89 89 val |= (u64)((stride / 128) - 1) << fence_pitch_shift; 90 90 if (i915_gem_object_get_tiling(vma->obj) == I915_TILING_Y) ··· 127 127 GEM_BUG_ON(!i915_vma_is_map_and_fenceable(vma)); 128 128 GEM_BUG_ON(vma->node.start & ~I915_FENCE_START_MASK); 129 129 GEM_BUG_ON(!is_power_of_2(vma->fence_size)); 130 - GEM_BUG_ON(vma->node.start & (vma->fence_size - 1)); 130 + GEM_BUG_ON(!IS_ALIGNED(vma->node.start, vma->fence_size)); 131 131 132 132 if (is_y_tiled && HAS_128_BYTE_Y_TILING(fence->i915)) 133 133 stride /= 128; ··· 166 166 GEM_BUG_ON(vma->node.start & ~I830_FENCE_START_MASK); 167 167 GEM_BUG_ON(!is_power_of_2(vma->fence_size)); 168 168 GEM_BUG_ON(!is_power_of_2(stride / 128)); 169 - GEM_BUG_ON(vma->node.start & (vma->fence_size - 1)); 169 + GEM_BUG_ON(!IS_ALIGNED(vma->node.start, vma->fence_size)); 170 170 171 171 val = vma->node.start; 172 172 if (i915_gem_object_get_tiling(vma->obj) == I915_TILING_Y)
+2
drivers/gpu/drm/i915/i915_gem_fence_reg.h
··· 30 30 struct drm_i915_private; 31 31 struct i915_vma; 32 32 33 + #define I965_FENCE_PAGE 4096UL 34 + 33 35 struct drm_i915_fence_reg { 34 36 struct list_head link; 35 37 struct drm_i915_private *i915;
+5 -5
drivers/gpu/drm/i915/i915_gem_gtt.c
··· 329 329 return -ENOMEM; 330 330 331 331 p->daddr = dma_map_page(kdev, 332 - p->page, 0, 4096, PCI_DMA_BIDIRECTIONAL); 332 + p->page, 0, PAGE_SIZE, PCI_DMA_BIDIRECTIONAL); 333 333 334 334 if (dma_mapping_error(kdev, p->daddr)) { 335 335 __free_page(p->page); ··· 353 353 if (WARN_ON(!p->page)) 354 354 return; 355 355 356 - dma_unmap_page(&pdev->dev, p->daddr, 4096, PCI_DMA_BIDIRECTIONAL); 356 + dma_unmap_page(&pdev->dev, p->daddr, PAGE_SIZE, PCI_DMA_BIDIRECTIONAL); 357 357 __free_page(p->page); 358 358 memset(p, 0, sizeof(*p)); 359 359 } ··· 2711 2711 u64 *end) 2712 2712 { 2713 2713 if (node->color != color) 2714 - *start += 4096; 2714 + *start += I915_GTT_PAGE_SIZE; 2715 2715 2716 2716 node = list_next_entry(node, node_list); 2717 2717 if (node->allocated && node->color != color) 2718 - *end -= 4096; 2718 + *end -= I915_GTT_PAGE_SIZE; 2719 2719 } 2720 2720 2721 2721 int i915_gem_init_ggtt(struct drm_i915_private *dev_priv) ··· 2742 2742 /* Reserve a mappable slot for our lockless error capture */ 2743 2743 ret = drm_mm_insert_node_in_range_generic(&ggtt->base.mm, 2744 2744 &ggtt->error_capture, 2745 - 4096, 0, 2745 + PAGE_SIZE, 0, 2746 2746 I915_COLOR_UNEVICTABLE, 2747 2747 0, ggtt->mappable_end, 2748 2748 0, 0);
+4 -1
drivers/gpu/drm/i915/i915_gem_gtt.h
··· 40 40 #include "i915_gem_timeline.h" 41 41 #include "i915_gem_request.h" 42 42 43 + #define I915_GTT_PAGE_SIZE 4096UL 44 + #define I915_GTT_MIN_ALIGNMENT I915_GTT_PAGE_SIZE 45 + 43 46 #define I915_FENCE_REG_NONE -1 44 47 #define I915_MAX_NUM_FENCES 32 45 48 /* 32 fences + sign bit for FENCE_REG_NONE */ ··· 546 543 #define PIN_HIGH BIT(9) 547 544 #define PIN_OFFSET_BIAS BIT(10) 548 545 #define PIN_OFFSET_FIXED BIT(11) 549 - #define PIN_OFFSET_MASK (~4095) 546 + #define PIN_OFFSET_MASK (-I915_GTT_PAGE_SIZE) 550 547 551 548 #endif
+2 -2
drivers/gpu/drm/i915/i915_gem_render_state.c
··· 187 187 if (!rodata) 188 188 return 0; 189 189 190 - if (rodata->batch_items * 4 > 4096) 190 + if (rodata->batch_items * 4 > PAGE_SIZE) 191 191 return -EINVAL; 192 192 193 193 so = kmalloc(sizeof(*so), GFP_KERNEL); 194 194 if (!so) 195 195 return -ENOMEM; 196 196 197 - obj = i915_gem_object_create_internal(engine->i915, 4096); 197 + obj = i915_gem_object_create_internal(engine->i915, PAGE_SIZE); 198 198 if (IS_ERR(obj)) { 199 199 ret = PTR_ERR(obj); 200 200 goto err_free;
+3 -2
drivers/gpu/drm/i915/i915_gem_stolen.c
··· 647 647 stolen_offset, gtt_offset, size); 648 648 649 649 /* KISS and expect everything to be page-aligned */ 650 - if (WARN_ON(size == 0) || WARN_ON(size & 4095) || 651 - WARN_ON(stolen_offset & 4095)) 650 + if (WARN_ON(size == 0) || 651 + WARN_ON(!IS_ALIGNED(size, I915_GTT_PAGE_SIZE)) || 652 + WARN_ON(!IS_ALIGNED(stolen_offset, I915_GTT_MIN_ALIGNMENT))) 652 653 return NULL; 653 654 654 655 stolen = kzalloc(sizeof(*stolen), GFP_KERNEL);
+8 -5
drivers/gpu/drm/i915/i915_gem_tiling.c
··· 82 82 83 83 if (INTEL_GEN(i915) >= 4) { 84 84 stride *= i915_gem_tile_height(tiling); 85 - GEM_BUG_ON(stride & 4095); 85 + GEM_BUG_ON(!IS_ALIGNED(stride, I965_FENCE_PAGE)); 86 86 return roundup(size, stride); 87 87 } 88 88 ··· 117 117 * Minimum alignment is 4k (GTT page size), but might be greater 118 118 * if a fence register is needed for the object. 119 119 */ 120 - if (INTEL_GEN(i915) >= 4 || tiling == I915_TILING_NONE) 121 - return 4096; 120 + if (tiling == I915_TILING_NONE) 121 + return I915_GTT_MIN_ALIGNMENT; 122 + 123 + if (INTEL_GEN(i915) >= 4) 124 + return I965_FENCE_PAGE; 122 125 123 126 /* 124 127 * Previous chips need to be aligned to the size of the smallest ··· 173 170 else 174 171 tile_width = 512; 175 172 176 - if (stride & (tile_width - 1)) 173 + if (!IS_ALIGNED(stride, tile_width)) 177 174 return false; 178 175 179 176 /* 965+ just needs multiples of tile width */ ··· 198 195 return false; 199 196 200 197 alignment = i915_gem_fence_alignment(i915, vma->size, tiling_mode, stride); 201 - if (vma->node.start & (alignment - 1)) 198 + if (!IS_ALIGNED(vma->node.start, alignment)) 202 199 return false; 203 200 204 201 return true;
+14 -7
drivers/gpu/drm/i915/i915_vma.c
··· 91 91 vma->vm = vm; 92 92 vma->obj = obj; 93 93 vma->size = obj->base.size; 94 - vma->display_alignment = 4096; 94 + vma->display_alignment = I915_GTT_MIN_ALIGNMENT; 95 95 96 96 if (view) { 97 97 vma->ggtt_view = *view; ··· 115 115 vma->fence_size = i915_gem_fence_size(vm->i915, vma->size, 116 116 i915_gem_object_get_tiling(obj), 117 117 i915_gem_object_get_stride(obj)); 118 - GEM_BUG_ON(vma->fence_size & 4095); 118 + GEM_BUG_ON(!IS_ALIGNED(vma->fence_size, I915_GTT_MIN_ALIGNMENT)); 119 119 120 120 vma->fence_alignment = i915_gem_fence_alignment(vm->i915, vma->size, 121 121 i915_gem_object_get_tiling(obj), ··· 270 270 if (vma->node.size < size) 271 271 return true; 272 272 273 - if (alignment && vma->node.start & (alignment - 1)) 273 + GEM_BUG_ON(alignment && !is_power_of_2(alignment)); 274 + if (alignment && !IS_ALIGNED(vma->node.start, alignment)) 274 275 return true; 275 276 276 277 if (flags & PIN_MAPPABLE && !i915_vma_is_map_and_fenceable(vma)) ··· 303 302 return; 304 303 305 304 fenceable = (vma->node.size >= vma->fence_size && 306 - (vma->node.start & (vma->fence_alignment - 1)) == 0); 305 + IS_ALIGNED(vma->node.start, vma->fence_alignment)); 307 306 308 307 mappable = vma->node.start + vma->fence_size <= i915_vm_to_ggtt(vma->vm)->mappable_end; 309 308 ··· 381 380 alignment, vma->fence_alignment); 382 381 } 383 382 383 + GEM_BUG_ON(!IS_ALIGNED(size, I915_GTT_PAGE_SIZE)); 384 + GEM_BUG_ON(!IS_ALIGNED(alignment, I915_GTT_MIN_ALIGNMENT)); 385 + GEM_BUG_ON(!is_power_of_2(alignment)); 386 + 384 387 start = flags & PIN_OFFSET_BIAS ? flags & PIN_OFFSET_MASK : 0; 388 + GEM_BUG_ON(!IS_ALIGNED(start, I915_GTT_PAGE_SIZE)); 385 389 386 390 end = vma->vm->total; 387 391 if (flags & PIN_MAPPABLE) 388 392 end = min_t(u64, end, dev_priv->ggtt.mappable_end); 389 393 if (flags & PIN_ZONE_4G) 390 - end = min_t(u64, end, (1ULL << 32) - PAGE_SIZE); 394 + end = min_t(u64, end, (1ULL << 32) - I915_GTT_PAGE_SIZE); 395 + GEM_BUG_ON(!IS_ALIGNED(end, I915_GTT_PAGE_SIZE)); 391 396 392 397 /* If binding the object/GGTT view requires more space than the entire 393 398 * aperture has, reject it early before evicting everything in a vain ··· 413 406 414 407 if (flags & PIN_OFFSET_FIXED) { 415 408 u64 offset = flags & PIN_OFFSET_MASK; 416 - if (offset & (alignment - 1) || 409 + if (!IS_ALIGNED(offset, alignment) || 417 410 range_overflows(offset, size, end)) { 418 411 ret = -EINVAL; 419 412 goto err_unpin; ··· 447 440 * with zero alignment, so where possible use the optimal 448 441 * path. 449 442 */ 450 - if (alignment <= 4096) 443 + if (alignment <= I915_GTT_MIN_ALIGNMENT) 451 444 alignment = 0; 452 445 453 446 search_free:
+3 -2
drivers/gpu/drm/i915/intel_lrc.c
··· 1927 1927 engine->emit_breadcrumb = gen8_emit_breadcrumb_render; 1928 1928 engine->emit_breadcrumb_sz = gen8_emit_breadcrumb_render_sz; 1929 1929 1930 - ret = intel_engine_create_scratch(engine, 4096); 1930 + ret = intel_engine_create_scratch(engine, PAGE_SIZE); 1931 1931 if (ret) 1932 1932 return ret; 1933 1933 ··· 2209 2209 2210 2210 WARN_ON(ce->state); 2211 2211 2212 - context_size = round_up(intel_lr_context_size(engine), 4096); 2212 + context_size = round_up(intel_lr_context_size(engine), 2213 + I915_GTT_PAGE_SIZE); 2213 2214 2214 2215 /* One extra page as the sharing data between driver and GuC */ 2215 2216 context_size += PAGE_SIZE * LRC_PPHWSP_PN;
+1 -1
drivers/gpu/drm/i915/intel_lrc.h
··· 26 26 27 27 #include "intel_ringbuffer.h" 28 28 29 - #define GEN8_LR_CONTEXT_ALIGN 4096 29 + #define GEN8_LR_CONTEXT_ALIGN I915_GTT_MIN_ALIGNMENT 30 30 31 31 /* Execlists regs */ 32 32 #define RING_ELSP(engine) _MMIO((engine)->mmio_base + 0x230)
+5 -5
drivers/gpu/drm/i915/intel_ringbuffer.c
··· 1736 1736 void *vaddr; 1737 1737 int ret; 1738 1738 1739 - obj = i915_gem_object_create_internal(engine->i915, 4096); 1739 + obj = i915_gem_object_create_internal(engine->i915, PAGE_SIZE); 1740 1740 if (IS_ERR(obj)) { 1741 1741 DRM_ERROR("Failed to allocate status page\n"); 1742 1742 return PTR_ERR(obj); ··· 1777 1777 1778 1778 engine->status_page.vma = vma; 1779 1779 engine->status_page.ggtt_offset = i915_ggtt_offset(vma); 1780 - engine->status_page.page_addr = memset(vaddr, 0, 4096); 1780 + engine->status_page.page_addr = memset(vaddr, 0, PAGE_SIZE); 1781 1781 1782 1782 DRM_DEBUG_DRIVER("%s hws offset: 0x%08x\n", 1783 1783 engine->name, i915_ggtt_offset(vma)); ··· 2049 2049 } 2050 2050 2051 2051 /* Ring wraparound at offset 0 sometimes hangs. No idea why. */ 2052 - ret = intel_ring_pin(ring, 4096); 2052 + ret = intel_ring_pin(ring, I915_GTT_PAGE_SIZE); 2053 2053 if (ret) { 2054 2054 intel_ring_free(ring); 2055 2055 goto error; ··· 2466 2466 if (INTEL_GEN(dev_priv) >= 8 && !dev_priv->semaphore) { 2467 2467 struct i915_vma *vma; 2468 2468 2469 - obj = i915_gem_object_create(dev_priv, 4096); 2469 + obj = i915_gem_object_create(dev_priv, PAGE_SIZE); 2470 2470 if (IS_ERR(obj)) 2471 2471 goto err; 2472 2472 ··· 2683 2683 return ret; 2684 2684 2685 2685 if (INTEL_GEN(dev_priv) >= 6) { 2686 - ret = intel_engine_create_scratch(engine, 4096); 2686 + ret = intel_engine_create_scratch(engine, PAGE_SIZE); 2687 2687 if (ret) 2688 2688 return ret; 2689 2689 } else if (HAS_BROKEN_CS_TLB(dev_priv)) {