[Intel-gfx] [PATCH v2 1/4] drm/i915: Wrap all access to i915_vma.node.start|size

Tvrtko Ursulin tvrtko.ursulin at linux.intel.com
Wed Nov 23 09:46:20 UTC 2022


On 22/11/2022 18:57, Andi Shyti wrote:
> From: Chris Wilson <chris at chris-wilson.co.uk>
> 
> We already wrap i915_vma.node.start for use with the GGTT, as there we
> can perform additional sanity checks that the node belongs to the GGTT
> and fits within the 32b registers. In the next couple of patches, we
> will introduce guard pages around the objects _inside_ the drm_mm_node
> allocation. That is we will offset the vma->pages so that the first page
> is at drm_mm_node.start + vma->guard (not 0 as is currently the case).
> All users must then not use i915_vma.node.start directly, but compute
> the guard offset, thus all users are converted to use a
> i915_vma_offset() wrapper.
> 
> The notable exceptions are the selftests that are testing exact
> behaviour of i915_vma_pin/i915_vma_insert.
> 
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> Signed-off-by: Tejas Upadhyay <tejaskumarx.surendrakumar.upadhyay at intel.com>
> Co-developed-by: Thomas Hellström <thomas.hellstrom at linux.intel.com>
> Signed-off-by: Thomas Hellström <thomas.hellstrom at linux.intel.com>
> Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
> Signed-off-by: Andi Shyti <andi.shyti at linux.intel.com>
> ---
>   drivers/gpu/drm/i915/display/intel_fbdev.c    |  2 +-
>   .../gpu/drm/i915/gem/i915_gem_execbuffer.c    | 33 ++++++------
>   drivers/gpu/drm/i915/gem/i915_gem_mman.c      |  2 +-
>   drivers/gpu/drm/i915/gem/i915_gem_shrinker.c  |  2 +-
>   drivers/gpu/drm/i915/gem/i915_gem_tiling.c    |  4 +-
>   .../gpu/drm/i915/gem/selftests/huge_pages.c   |  2 +-
>   .../i915/gem/selftests/i915_gem_client_blt.c  | 23 +++++----
>   .../drm/i915/gem/selftests/i915_gem_context.c | 15 +++---
>   .../drm/i915/gem/selftests/i915_gem_mman.c    |  2 +-
>   .../drm/i915/gem/selftests/igt_gem_utils.c    |  7 +--
>   drivers/gpu/drm/i915/gt/gen7_renderclear.c    |  2 +-
>   drivers/gpu/drm/i915/gt/intel_ggtt_fencing.c  |  3 +-
>   drivers/gpu/drm/i915/gt/intel_renderstate.c   |  2 +-
>   .../gpu/drm/i915/gt/intel_ring_submission.c   |  2 +-
>   drivers/gpu/drm/i915/gt/selftest_engine_cs.c  |  8 +--
>   drivers/gpu/drm/i915/gt/selftest_execlists.c  | 18 +++----
>   drivers/gpu/drm/i915/gt/selftest_hangcheck.c  | 15 +++---
>   drivers/gpu/drm/i915/gt/selftest_lrc.c        | 16 +++---
>   .../drm/i915/gt/selftest_ring_submission.c    |  2 +-
>   drivers/gpu/drm/i915/gt/selftest_rps.c        | 12 ++---
>   .../gpu/drm/i915/gt/selftest_workarounds.c    |  8 +--
>   drivers/gpu/drm/i915/i915_cmd_parser.c        |  4 +-
>   drivers/gpu/drm/i915/i915_debugfs.c           |  2 +-
>   drivers/gpu/drm/i915/i915_perf.c              |  2 +-
>   drivers/gpu/drm/i915/i915_vma.c               | 25 ++++-----
>   drivers/gpu/drm/i915/i915_vma.h               | 51 +++++++++++++++++--
>   drivers/gpu/drm/i915/i915_vma_resource.h      | 10 ++--
>   drivers/gpu/drm/i915/selftests/i915_request.c | 20 ++++----
>   drivers/gpu/drm/i915/selftests/igt_spinner.c  |  8 +--
>   29 files changed, 180 insertions(+), 122 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_fbdev.c b/drivers/gpu/drm/i915/display/intel_fbdev.c
> index 5575d7abdc092..03ed4607a46d2 100644
> --- a/drivers/gpu/drm/i915/display/intel_fbdev.c
> +++ b/drivers/gpu/drm/i915/display/intel_fbdev.c
> @@ -286,7 +286,7 @@ static int intelfb_create(struct drm_fb_helper *helper,
>   
>   		/* Our framebuffer is the entirety of fbdev's system memory */
>   		info->fix.smem_start =
> -			(unsigned long)(ggtt->gmadr.start + vma->node.start);
> +			(unsigned long)(ggtt->gmadr.start + i915_ggtt_offset(vma));
>   		info->fix.smem_len = vma->size;
>   	}
>   
> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
> index 29e9e8d5b6fec..86956b902c978 100644
> --- a/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
> +++ b/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c
> @@ -379,22 +379,25 @@ eb_vma_misplaced(const struct drm_i915_gem_exec_object2 *entry,
>   		 const struct i915_vma *vma,
>   		 unsigned int flags)
>   {
> -	if (vma->node.size < entry->pad_to_size)
> +	const u64 start = i915_vma_offset(vma);
> +	const u64 size = i915_vma_size(vma);
> +
> +	if (size < entry->pad_to_size)
>   		return true;
>   
> -	if (entry->alignment && !IS_ALIGNED(vma->node.start, entry->alignment))
> +	if (entry->alignment && !IS_ALIGNED(start, entry->alignment))
>   		return true;
>   
>   	if (flags & EXEC_OBJECT_PINNED &&
> -	    vma->node.start != entry->offset)
> +	    start != entry->offset)
>   		return true;
>   
>   	if (flags & __EXEC_OBJECT_NEEDS_BIAS &&
> -	    vma->node.start < BATCH_OFFSET_BIAS)
> +	    start < BATCH_OFFSET_BIAS)
>   		return true;
>   
>   	if (!(flags & EXEC_OBJECT_SUPPORTS_48B_ADDRESS) &&
> -	    (vma->node.start + vma->node.size + 4095) >> 32)
> +	    (start + size + 4095) >> 32)
>   		return true;
>   
>   	if (flags & __EXEC_OBJECT_NEEDS_MAP &&
> @@ -440,7 +443,7 @@ eb_pin_vma(struct i915_execbuffer *eb,
>   	int err;
>   
>   	if (vma->node.size)
> -		pin_flags = vma->node.start;
> +		pin_flags =  __i915_vma_offset(vma);
>   	else
>   		pin_flags = entry->offset & PIN_OFFSET_MASK;
>   
> @@ -663,8 +666,8 @@ static int eb_reserve_vma(struct i915_execbuffer *eb,
>   	if (err)
>   		return err;
>   
> -	if (entry->offset != vma->node.start) {
> -		entry->offset = vma->node.start | UPDATE;
> +	if (entry->offset != i915_vma_offset(vma)) {
> +		entry->offset = i915_vma_offset(vma) | UPDATE;
>   		eb->args->flags |= __EXEC_HAS_RELOC;
>   	}
>   
> @@ -984,8 +987,8 @@ static int eb_validate_vmas(struct i915_execbuffer *eb)
>   			return err;
>   
>   		if (!err) {
> -			if (entry->offset != vma->node.start) {
> -				entry->offset = vma->node.start | UPDATE;
> +			if (entry->offset != i915_vma_offset(vma)) {
> +				entry->offset = i915_vma_offset(vma) | UPDATE;
>   				eb->args->flags |= __EXEC_HAS_RELOC;
>   			}
>   		} else {
> @@ -1066,7 +1069,7 @@ static inline u64
>   relocation_target(const struct drm_i915_gem_relocation_entry *reloc,
>   		  const struct i915_vma *target)
>   {
> -	return gen8_canonical_addr((int)reloc->delta + target->node.start);
> +	return gen8_canonical_addr((int)reloc->delta + i915_vma_offset(target));
>   }
>   
>   static void reloc_cache_init(struct reloc_cache *cache,
> @@ -1275,7 +1278,7 @@ static void *reloc_iomap(struct i915_vma *batch,
>   			if (err) /* no inactive aperture space, use cpu reloc */
>   				return NULL;
>   		} else {
> -			cache->node.start = vma->node.start;
> +			cache->node.start = i915_ggtt_offset(vma);
>   			cache->node.mm = (void *)vma;
>   		}
>   	}
> @@ -1438,7 +1441,7 @@ eb_relocate_entry(struct i915_execbuffer *eb,
>   	 * more work needs to be done.
>   	 */
>   	if (!DBG_FORCE_RELOC &&
> -	    gen8_canonical_addr(target->vma->node.start) == reloc->presumed_offset)
> +	    gen8_canonical_addr(i915_vma_offset(target->vma)) == reloc->presumed_offset)
>   		return 0;
>   
>   	/* Check that the relocation address is valid... */
> @@ -2368,7 +2371,7 @@ static int eb_request_submit(struct i915_execbuffer *eb,
>   	}
>   
>   	err = rq->context->engine->emit_bb_start(rq,
> -						 batch->node.start +
> +						 i915_vma_offset(batch) +
>   						 eb->batch_start_offset,
>   						 batch_len,
>   						 eb->batch_flags);
> @@ -2379,7 +2382,7 @@ static int eb_request_submit(struct i915_execbuffer *eb,
>   		GEM_BUG_ON(intel_context_is_parallel(rq->context));
>   		GEM_BUG_ON(eb->batch_start_offset);
>   		err = rq->context->engine->emit_bb_start(rq,
> -							 eb->trampoline->node.start +
> +							 i915_vma_offset(eb->trampoline) +
>   							 batch_len, 0, 0);
>   		if (err)
>   			return err;
> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_mman.c b/drivers/gpu/drm/i915/gem/i915_gem_mman.c
> index c29efdef8313a..d73ba0f5c4c52 100644
> --- a/drivers/gpu/drm/i915/gem/i915_gem_mman.c
> +++ b/drivers/gpu/drm/i915/gem/i915_gem_mman.c
> @@ -395,7 +395,7 @@ static vm_fault_t vm_fault_gtt(struct vm_fault *vmf)
>   	/* Finally, remap it using the new GTT offset */
>   	ret = remap_io_mapping(area,
>   			       area->vm_start + (vma->gtt_view.partial.offset << PAGE_SHIFT),
> -			       (ggtt->gmadr.start + vma->node.start) >> PAGE_SHIFT,
> +			       (ggtt->gmadr.start + i915_ggtt_offset(vma)) >> PAGE_SHIFT,
>   			       min_t(u64, vma->size, area->vm_end - area->vm_start),
>   			       &ggtt->iomap);
>   	if (ret)
> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_shrinker.c b/drivers/gpu/drm/i915/gem/i915_gem_shrinker.c
> index 8dc5c8874d8a2..b1672e054b21e 100644
> --- a/drivers/gpu/drm/i915/gem/i915_gem_shrinker.c
> +++ b/drivers/gpu/drm/i915/gem/i915_gem_shrinker.c
> @@ -400,7 +400,7 @@ i915_gem_shrinker_vmap(struct notifier_block *nb, unsigned long event, void *ptr
>   	mutex_lock(&to_gt(i915)->ggtt->vm.mutex);
>   	list_for_each_entry_safe(vma, next,
>   				 &to_gt(i915)->ggtt->vm.bound_list, vm_link) {
> -		unsigned long count = vma->node.size >> PAGE_SHIFT;
> +		unsigned long count = i915_vma_size(vma) >> PAGE_SHIFT;
>   		struct drm_i915_gem_object *obj = vma->obj;
>   
>   		if (!vma->iomap || i915_vma_is_active(vma))
> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_tiling.c b/drivers/gpu/drm/i915/gem/i915_gem_tiling.c
> index fd42b89b7162b..04bb909acdec8 100644
> --- a/drivers/gpu/drm/i915/gem/i915_gem_tiling.c
> +++ b/drivers/gpu/drm/i915/gem/i915_gem_tiling.c
> @@ -168,11 +168,11 @@ static bool i915_vma_fence_prepare(struct i915_vma *vma,
>   		return true;
>   
>   	size = i915_gem_fence_size(i915, vma->size, tiling_mode, stride);
> -	if (vma->node.size < size)
> +	if (i915_vma_size(vma) < size)
>   		return false;
>   
>   	alignment = i915_gem_fence_alignment(i915, vma->size, tiling_mode, stride);
> -	if (!IS_ALIGNED(vma->node.start, alignment))
> +	if (!IS_ALIGNED(i915_ggtt_offset(vma), alignment))
>   		return false;
>   
>   	return true;
> diff --git a/drivers/gpu/drm/i915/gem/selftests/huge_pages.c b/drivers/gpu/drm/i915/gem/selftests/huge_pages.c
> index beaf27e09e8a9..e0c2ac9c8053a 100644
> --- a/drivers/gpu/drm/i915/gem/selftests/huge_pages.c
> +++ b/drivers/gpu/drm/i915/gem/selftests/huge_pages.c
> @@ -400,7 +400,7 @@ static int igt_check_page_sizes(struct i915_vma *vma)
>   	 * Maintaining alignment is required to utilise huge pages in the ppGGT.
>   	 */
>   	if (i915_gem_object_is_lmem(obj) &&
> -	    IS_ALIGNED(vma->node.start, SZ_2M) &&
> +	    IS_ALIGNED(i915_vma_offset(vma), SZ_2M) &&
>   	    vma->page_sizes.sg & SZ_2M &&
>   	    vma->resource->page_sizes_gtt < SZ_2M) {
>   		pr_err("gtt pages mismatch for LMEM, expected 2M GTT pages, sg(%u), gtt(%u)\n",
> diff --git a/drivers/gpu/drm/i915/gem/selftests/i915_gem_client_blt.c b/drivers/gpu/drm/i915/gem/selftests/i915_gem_client_blt.c
> index 692a16914ca0f..3bb1f7f0110e6 100644
> --- a/drivers/gpu/drm/i915/gem/selftests/i915_gem_client_blt.c
> +++ b/drivers/gpu/drm/i915/gem/selftests/i915_gem_client_blt.c
> @@ -194,12 +194,12 @@ static int prepare_blit(const struct tiled_blits *t,
>   		*cs++ = src_4t | dst_4t | BLT_DEPTH_32 | dst_pitch;
>   		*cs++ = 0;
>   		*cs++ = t->height << 16 | t->width;
> -		*cs++ = lower_32_bits(dst->vma->node.start);
> -		*cs++ = upper_32_bits(dst->vma->node.start);
> +		*cs++ = lower_32_bits(i915_vma_offset(dst->vma));
> +		*cs++ = upper_32_bits(i915_vma_offset(dst->vma));
>   		*cs++ = 0;
>   		*cs++ = src_pitch;
> -		*cs++ = lower_32_bits(src->vma->node.start);
> -		*cs++ = upper_32_bits(src->vma->node.start);
> +		*cs++ = lower_32_bits(i915_vma_offset(src->vma));
> +		*cs++ = upper_32_bits(i915_vma_offset(src->vma));
>   	} else {
>   		if (ver >= 6) {
>   			*cs++ = MI_LOAD_REGISTER_IMM(1);
> @@ -240,14 +240,14 @@ static int prepare_blit(const struct tiled_blits *t,
>   		*cs++ = BLT_DEPTH_32 | BLT_ROP_SRC_COPY | dst_pitch;
>   		*cs++ = 0;
>   		*cs++ = t->height << 16 | t->width;
> -		*cs++ = lower_32_bits(dst->vma->node.start);
> +		*cs++ = lower_32_bits(i915_vma_offset(dst->vma));
>   		if (use_64b_reloc)
> -			*cs++ = upper_32_bits(dst->vma->node.start);
> +			*cs++ = upper_32_bits(i915_vma_offset(dst->vma));
>   		*cs++ = 0;
>   		*cs++ = src_pitch;
> -		*cs++ = lower_32_bits(src->vma->node.start);
> +		*cs++ = lower_32_bits(i915_vma_offset(src->vma));
>   		if (use_64b_reloc)
> -			*cs++ = upper_32_bits(src->vma->node.start);
> +			*cs++ = upper_32_bits(i915_vma_offset(src->vma));
>   	}
>   
>   	*cs++ = MI_BATCH_BUFFER_END;
> @@ -462,7 +462,7 @@ static int pin_buffer(struct i915_vma *vma, u64 addr)
>   {
>   	int err;
>   
> -	if (drm_mm_node_allocated(&vma->node) && vma->node.start != addr) {
> +	if (drm_mm_node_allocated(&vma->node) && i915_vma_offset(vma) != addr) {
>   		err = i915_vma_unbind_unlocked(vma);
>   		if (err)
>   			return err;
> @@ -472,6 +472,7 @@ static int pin_buffer(struct i915_vma *vma, u64 addr)
>   	if (err)
>   		return err;
>   
> +	GEM_BUG_ON(i915_vma_offset(vma) != addr);
>   	return 0;
>   }
>   
> @@ -518,8 +519,8 @@ tiled_blit(struct tiled_blits *t,
>   		err = igt_vma_move_to_active_unlocked(dst->vma, rq, 0);
>   	if (!err)
>   		err = rq->engine->emit_bb_start(rq,
> -						t->batch->node.start,
> -						t->batch->node.size,
> +						i915_vma_offset(t->batch),
> +						i915_vma_size(t->batch),
>   						0);
>   	i915_request_get(rq);
>   	i915_request_add(rq);
> diff --git a/drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c b/drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c
> index a0ff51d71d07a..ac02fb0365920 100644
> --- a/drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c
> +++ b/drivers/gpu/drm/i915/gem/selftests/i915_gem_context.c
> @@ -914,8 +914,8 @@ static int rpcs_query_batch(struct drm_i915_gem_object *rpcs,
>   
>   	*cmd++ = MI_STORE_REGISTER_MEM_GEN8;
>   	*cmd++ = i915_mmio_reg_offset(GEN8_R_PWR_CLK_STATE(engine->mmio_base));
> -	*cmd++ = lower_32_bits(vma->node.start);
> -	*cmd++ = upper_32_bits(vma->node.start);
> +	*cmd++ = lower_32_bits(i915_vma_offset(vma));
> +	*cmd++ = upper_32_bits(i915_vma_offset(vma));
>   	*cmd = MI_BATCH_BUFFER_END;
>   
>   	__i915_gem_object_flush_map(rpcs, 0, 64);
> @@ -999,7 +999,8 @@ emit_rpcs_query(struct drm_i915_gem_object *obj,
>   	}
>   
>   	err = rq->engine->emit_bb_start(rq,
> -					batch->node.start, batch->node.size,
> +					i915_vma_offset(batch),
> +					i915_vma_size(batch),
>   					0);
>   	if (err)
>   		goto skip_request;
> @@ -1560,7 +1561,8 @@ static int write_to_scratch(struct i915_gem_context *ctx,
>   			goto skip_request;
>   	}
>   
> -	err = engine->emit_bb_start(rq, vma->node.start, vma->node.size, 0);
> +	err = engine->emit_bb_start(rq, i915_vma_offset(vma),
> +				    i915_vma_size(vma), 0);
>   	if (err)
>   		goto skip_request;
>   
> @@ -1665,7 +1667,7 @@ static int read_from_scratch(struct i915_gem_context *ctx,
>   		*cmd++ = offset;
>   		*cmd++ = MI_STORE_REGISTER_MEM | MI_USE_GGTT;
>   		*cmd++ = reg;
> -		*cmd++ = vma->node.start + result;
> +		*cmd++ = i915_vma_offset(vma) + result;
>   		*cmd = MI_BATCH_BUFFER_END;
>   
>   		i915_gem_object_flush_map(obj);
> @@ -1694,7 +1696,8 @@ static int read_from_scratch(struct i915_gem_context *ctx,
>   			goto skip_request;
>   	}
>   
> -	err = engine->emit_bb_start(rq, vma->node.start, vma->node.size, flags);
> +	err = engine->emit_bb_start(rq, i915_vma_offset(vma),
> +				    i915_vma_size(vma), flags);
>   	if (err)
>   		goto skip_request;
>   
> diff --git a/drivers/gpu/drm/i915/gem/selftests/i915_gem_mman.c b/drivers/gpu/drm/i915/gem/selftests/i915_gem_mman.c
> index 3f658d5717d83..7f6353827735a 100644
> --- a/drivers/gpu/drm/i915/gem/selftests/i915_gem_mman.c
> +++ b/drivers/gpu/drm/i915/gem/selftests/i915_gem_mman.c
> @@ -1609,7 +1609,7 @@ static int __igt_mmap_gpu(struct drm_i915_private *i915,
>   
>   		err = i915_vma_move_to_active(vma, rq, 0);
>   
> -		err = engine->emit_bb_start(rq, vma->node.start, 0, 0);
> +		err = engine->emit_bb_start(rq, i915_vma_offset(vma), 0, 0);
>   		i915_request_get(rq);
>   		i915_request_add(rq);
>   
> diff --git a/drivers/gpu/drm/i915/gem/selftests/igt_gem_utils.c b/drivers/gpu/drm/i915/gem/selftests/igt_gem_utils.c
> index 374b10ac430e8..c147038230c46 100644
> --- a/drivers/gpu/drm/i915/gem/selftests/igt_gem_utils.c
> +++ b/drivers/gpu/drm/i915/gem/selftests/igt_gem_utils.c
> @@ -62,8 +62,8 @@ igt_emit_store_dw(struct i915_vma *vma,
>   		goto err;
>   	}
>   
> -	GEM_BUG_ON(offset + (count - 1) * PAGE_SIZE > vma->node.size);
> -	offset += vma->node.start;
> +	GEM_BUG_ON(offset + (count - 1) * PAGE_SIZE > i915_vma_size(vma));
> +	offset += i915_vma_offset(vma);
>   
>   	for (n = 0; n < count; n++) {
>   		if (ver >= 8) {
> @@ -147,7 +147,8 @@ int igt_gpu_fill_dw(struct intel_context *ce,
>   		flags |= I915_DISPATCH_SECURE;
>   
>   	err = rq->engine->emit_bb_start(rq,
> -					batch->node.start, batch->node.size,
> +					i915_vma_offset(batch),
> +					i915_vma_size(batch),
>   					flags);
>   
>   skip_request:
> diff --git a/drivers/gpu/drm/i915/gt/gen7_renderclear.c b/drivers/gpu/drm/i915/gt/gen7_renderclear.c
> index 317efb145787e..d38b914d12069 100644
> --- a/drivers/gpu/drm/i915/gt/gen7_renderclear.c
> +++ b/drivers/gpu/drm/i915/gt/gen7_renderclear.c
> @@ -106,7 +106,7 @@ static u32 batch_offset(const struct batch_chunk *bc, u32 *cs)
>   
>   static u32 batch_addr(const struct batch_chunk *bc)
>   {
> -	return bc->vma->node.start;
> +	return i915_vma_offset(bc->vma);
>   }
>   
>   static void batch_add(struct batch_chunk *bc, const u32 d)
> diff --git a/drivers/gpu/drm/i915/gt/intel_ggtt_fencing.c b/drivers/gpu/drm/i915/gt/intel_ggtt_fencing.c
> index 995082d45cb21..7ac8ed13e1fe3 100644
> --- a/drivers/gpu/drm/i915/gt/intel_ggtt_fencing.c
> +++ b/drivers/gpu/drm/i915/gt/intel_ggtt_fencing.c
> @@ -220,7 +220,8 @@ static int fence_update(struct i915_fence_reg *fence,
>   				return ret;
>   		}
>   
> -		fence->start = vma->node.start;
> +		GEM_BUG_ON(vma->fence_size > i915_vma_size(vma));
> +		fence->start = i915_ggtt_offset(vma);
>   		fence->size = vma->fence_size;
>   		fence->stride = i915_gem_object_get_stride(vma->obj);
>   		fence->tiling = i915_gem_object_get_tiling(vma->obj);
> diff --git a/drivers/gpu/drm/i915/gt/intel_renderstate.c b/drivers/gpu/drm/i915/gt/intel_renderstate.c
> index 9c1ae070ee7b9..4b56ec3743cf3 100644
> --- a/drivers/gpu/drm/i915/gt/intel_renderstate.c
> +++ b/drivers/gpu/drm/i915/gt/intel_renderstate.c
> @@ -63,7 +63,7 @@ static int render_state_setup(struct intel_renderstate *so,
>   		u32 s = rodata->batch[i];
>   
>   		if (i * 4  == rodata->reloc[reloc_index]) {
> -			u64 r = s + so->vma->node.start;
> +			u64 r = s + i915_vma_offset(so->vma);
>   
>   			s = lower_32_bits(r);
>   			if (HAS_64BIT_RELOC(i915)) {
> diff --git a/drivers/gpu/drm/i915/gt/intel_ring_submission.c b/drivers/gpu/drm/i915/gt/intel_ring_submission.c
> index 356c787e11d38..827adb0cfaea6 100644
> --- a/drivers/gpu/drm/i915/gt/intel_ring_submission.c
> +++ b/drivers/gpu/drm/i915/gt/intel_ring_submission.c
> @@ -897,7 +897,7 @@ static int clear_residuals(struct i915_request *rq)
>   	}
>   
>   	ret = engine->emit_bb_start(rq,
> -				    engine->wa_ctx.vma->node.start, 0,
> +				    i915_vma_offset(engine->wa_ctx.vma), 0,
>   				    0);
>   	if (ret)
>   		return ret;
> diff --git a/drivers/gpu/drm/i915/gt/selftest_engine_cs.c b/drivers/gpu/drm/i915/gt/selftest_engine_cs.c
> index 881b64f3e7b99..542ce6d2de192 100644
> --- a/drivers/gpu/drm/i915/gt/selftest_engine_cs.c
> +++ b/drivers/gpu/drm/i915/gt/selftest_engine_cs.c
> @@ -178,7 +178,7 @@ static int perf_mi_bb_start(void *arg)
>   				goto out;
>   
>   			err = rq->engine->emit_bb_start(rq,
> -							batch->node.start, 8,
> +							i915_vma_offset(batch), 8,
>   							0);
>   			if (err)
>   				goto out;
> @@ -321,7 +321,7 @@ static int perf_mi_noop(void *arg)
>   				goto out;
>   
>   			err = rq->engine->emit_bb_start(rq,
> -							base->node.start, 8,
> +							i915_vma_offset(base), 8,
>   							0);
>   			if (err)
>   				goto out;
> @@ -331,8 +331,8 @@ static int perf_mi_noop(void *arg)
>   				goto out;
>   
>   			err = rq->engine->emit_bb_start(rq,
> -							nop->node.start,
> -							nop->node.size,
> +							i915_vma_offset(nop),
> +							i915_vma_size(nop),
>   							0);
>   			if (err)
>   				goto out;
> diff --git a/drivers/gpu/drm/i915/gt/selftest_execlists.c b/drivers/gpu/drm/i915/gt/selftest_execlists.c
> index ab2e9a6a24522..a619057543fd9 100644
> --- a/drivers/gpu/drm/i915/gt/selftest_execlists.c
> +++ b/drivers/gpu/drm/i915/gt/selftest_execlists.c
> @@ -2737,11 +2737,11 @@ static int create_gang(struct intel_engine_cs *engine,
>   		MI_SEMAPHORE_POLL |
>   		MI_SEMAPHORE_SAD_EQ_SDD;
>   	*cs++ = 0;
> -	*cs++ = lower_32_bits(vma->node.start);
> -	*cs++ = upper_32_bits(vma->node.start);
> +	*cs++ = lower_32_bits(i915_vma_offset(vma));
> +	*cs++ = upper_32_bits(i915_vma_offset(vma));
>   
>   	if (*prev) {
> -		u64 offset = (*prev)->batch->node.start;
> +		u64 offset = i915_vma_offset((*prev)->batch);
>   
>   		/* Terminate the spinner in the next lower priority batch. */
>   		*cs++ = MI_STORE_DWORD_IMM_GEN4;
> @@ -2767,7 +2767,7 @@ static int create_gang(struct intel_engine_cs *engine,
>   	err = i915_vma_move_to_active(vma, rq, 0);
>   	if (!err)
>   		err = rq->engine->emit_bb_start(rq,
> -						vma->node.start,
> +						i915_vma_offset(vma),
>   						PAGE_SIZE, 0);
>   	i915_vma_unlock(vma);
>   	i915_request_add(rq);
> @@ -3095,7 +3095,7 @@ create_gpr_user(struct intel_engine_cs *engine,
>   		*cs++ = MI_MATH_ADD;
>   		*cs++ = MI_MATH_STORE(MI_MATH_REG(i), MI_MATH_REG_ACCU);
>   
> -		addr = result->node.start + offset + i * sizeof(*cs);
> +		addr = i915_vma_offset(result) + offset + i * sizeof(*cs);
>   		*cs++ = MI_STORE_REGISTER_MEM_GEN8;
>   		*cs++ = CS_GPR(engine, 2 * i);
>   		*cs++ = lower_32_bits(addr);
> @@ -3105,8 +3105,8 @@ create_gpr_user(struct intel_engine_cs *engine,
>   			MI_SEMAPHORE_POLL |
>   			MI_SEMAPHORE_SAD_GTE_SDD;
>   		*cs++ = i;
> -		*cs++ = lower_32_bits(result->node.start);
> -		*cs++ = upper_32_bits(result->node.start);
> +		*cs++ = lower_32_bits(i915_vma_offset(result));
> +		*cs++ = upper_32_bits(i915_vma_offset(result));
>   	}
>   
>   	*cs++ = MI_BATCH_BUFFER_END;
> @@ -3186,7 +3186,7 @@ create_gpr_client(struct intel_engine_cs *engine,
>   		err = i915_vma_move_to_active(batch, rq, 0);
>   	if (!err)
>   		err = rq->engine->emit_bb_start(rq,
> -						batch->node.start,
> +						i915_vma_offset(batch),
>   						PAGE_SIZE, 0);
>   	i915_vma_unlock(batch);
>   	i915_vma_unpin(batch);
> @@ -3518,7 +3518,7 @@ static int smoke_submit(struct preempt_smoke *smoke,
>   		err = i915_vma_move_to_active(vma, rq, 0);
>   		if (!err)
>   			err = rq->engine->emit_bb_start(rq,
> -							vma->node.start,
> +							i915_vma_offset(vma),
>   							PAGE_SIZE, 0);
>   		i915_vma_unlock(vma);
>   	}
> diff --git a/drivers/gpu/drm/i915/gt/selftest_hangcheck.c b/drivers/gpu/drm/i915/gt/selftest_hangcheck.c
> index bc05ef48c194a..8b0d84f2aad22 100644
> --- a/drivers/gpu/drm/i915/gt/selftest_hangcheck.c
> +++ b/drivers/gpu/drm/i915/gt/selftest_hangcheck.c
> @@ -96,7 +96,8 @@ static int hang_init(struct hang *h, struct intel_gt *gt)
>   static u64 hws_address(const struct i915_vma *hws,
>   		       const struct i915_request *rq)
>   {
> -	return hws->node.start + offset_in_page(sizeof(u32)*rq->fence.context);
> +	return i915_vma_offset(hws) +
> +	       offset_in_page(sizeof(u32) * rq->fence.context);
>   }
>   
>   static struct i915_request *
> @@ -180,8 +181,8 @@ hang_create_request(struct hang *h, struct intel_engine_cs *engine)
>   
>   		*batch++ = MI_NOOP;
>   		*batch++ = MI_BATCH_BUFFER_START | 1 << 8 | 1;
> -		*batch++ = lower_32_bits(vma->node.start);
> -		*batch++ = upper_32_bits(vma->node.start);
> +		*batch++ = lower_32_bits(i915_vma_offset(vma));
> +		*batch++ = upper_32_bits(i915_vma_offset(vma));
>   	} else if (GRAPHICS_VER(gt->i915) >= 6) {
>   		*batch++ = MI_STORE_DWORD_IMM_GEN4;
>   		*batch++ = 0;
> @@ -194,7 +195,7 @@ hang_create_request(struct hang *h, struct intel_engine_cs *engine)
>   
>   		*batch++ = MI_NOOP;
>   		*batch++ = MI_BATCH_BUFFER_START | 1 << 8;
> -		*batch++ = lower_32_bits(vma->node.start);
> +		*batch++ = lower_32_bits(i915_vma_offset(vma));
>   	} else if (GRAPHICS_VER(gt->i915) >= 4) {
>   		*batch++ = MI_STORE_DWORD_IMM_GEN4 | MI_USE_GGTT;
>   		*batch++ = 0;
> @@ -207,7 +208,7 @@ hang_create_request(struct hang *h, struct intel_engine_cs *engine)
>   
>   		*batch++ = MI_NOOP;
>   		*batch++ = MI_BATCH_BUFFER_START | 2 << 6;
> -		*batch++ = lower_32_bits(vma->node.start);
> +		*batch++ = lower_32_bits(i915_vma_offset(vma));
>   	} else {
>   		*batch++ = MI_STORE_DWORD_IMM | MI_MEM_VIRTUAL;
>   		*batch++ = lower_32_bits(hws_address(hws, rq));
> @@ -219,7 +220,7 @@ hang_create_request(struct hang *h, struct intel_engine_cs *engine)
>   
>   		*batch++ = MI_NOOP;
>   		*batch++ = MI_BATCH_BUFFER_START | 2 << 6;
> -		*batch++ = lower_32_bits(vma->node.start);
> +		*batch++ = lower_32_bits(i915_vma_offset(vma));
>   	}
>   	*batch++ = MI_BATCH_BUFFER_END; /* not reached */
>   	intel_gt_chipset_flush(engine->gt);
> @@ -234,7 +235,7 @@ hang_create_request(struct hang *h, struct intel_engine_cs *engine)
>   	if (GRAPHICS_VER(gt->i915) <= 5)
>   		flags |= I915_DISPATCH_SECURE;
>   
> -	err = rq->engine->emit_bb_start(rq, vma->node.start, PAGE_SIZE, flags);
> +	err = rq->engine->emit_bb_start(rq, i915_vma_offset(vma), PAGE_SIZE, flags);
>   
>   cancel_rq:
>   	if (err) {
> diff --git a/drivers/gpu/drm/i915/gt/selftest_lrc.c b/drivers/gpu/drm/i915/gt/selftest_lrc.c
> index 7c56ffd2c6597..a61ae9d7e0a22 100644
> --- a/drivers/gpu/drm/i915/gt/selftest_lrc.c
> +++ b/drivers/gpu/drm/i915/gt/selftest_lrc.c
> @@ -1030,8 +1030,8 @@ store_context(struct intel_context *ce, struct i915_vma *scratch)
>   		while (len--) {
>   			*cs++ = MI_STORE_REGISTER_MEM_GEN8;
>   			*cs++ = hw[dw];
> -			*cs++ = lower_32_bits(scratch->node.start + x);
> -			*cs++ = upper_32_bits(scratch->node.start + x);
> +			*cs++ = lower_32_bits(i915_vma_offset(scratch) + x);
> +			*cs++ = upper_32_bits(i915_vma_offset(scratch) + x);
>   
>   			dw += 2;
>   			x += 4;
> @@ -1098,8 +1098,8 @@ record_registers(struct intel_context *ce,
>   
>   	*cs++ = MI_ARB_ON_OFF | MI_ARB_DISABLE;
>   	*cs++ = MI_BATCH_BUFFER_START_GEN8 | BIT(8);
> -	*cs++ = lower_32_bits(b_before->node.start);
> -	*cs++ = upper_32_bits(b_before->node.start);
> +	*cs++ = lower_32_bits(i915_vma_offset(b_before));
> +	*cs++ = upper_32_bits(i915_vma_offset(b_before));
>   
>   	*cs++ = MI_ARB_ON_OFF | MI_ARB_ENABLE;
>   	*cs++ = MI_SEMAPHORE_WAIT |
> @@ -1114,8 +1114,8 @@ record_registers(struct intel_context *ce,
>   
>   	*cs++ = MI_ARB_ON_OFF | MI_ARB_DISABLE;
>   	*cs++ = MI_BATCH_BUFFER_START_GEN8 | BIT(8);
> -	*cs++ = lower_32_bits(b_after->node.start);
> -	*cs++ = upper_32_bits(b_after->node.start);
> +	*cs++ = lower_32_bits(i915_vma_offset(b_after));
> +	*cs++ = upper_32_bits(i915_vma_offset(b_after));
>   
>   	intel_ring_advance(rq, cs);
>   
> @@ -1236,8 +1236,8 @@ static int poison_registers(struct intel_context *ce, u32 poison, u32 *sema)
>   
>   	*cs++ = MI_ARB_ON_OFF | MI_ARB_DISABLE;
>   	*cs++ = MI_BATCH_BUFFER_START_GEN8 | BIT(8);
> -	*cs++ = lower_32_bits(batch->node.start);
> -	*cs++ = upper_32_bits(batch->node.start);
> +	*cs++ = lower_32_bits(i915_vma_offset(batch));
> +	*cs++ = upper_32_bits(i915_vma_offset(batch));
>   
>   	*cs++ = MI_STORE_DWORD_IMM_GEN4 | MI_USE_GGTT;
>   	*cs++ = i915_ggtt_offset(ce->engine->status_page.vma) +
> diff --git a/drivers/gpu/drm/i915/gt/selftest_ring_submission.c b/drivers/gpu/drm/i915/gt/selftest_ring_submission.c
> index 70f9ac1ec2c76..87ceb0f374b67 100644
> --- a/drivers/gpu/drm/i915/gt/selftest_ring_submission.c
> +++ b/drivers/gpu/drm/i915/gt/selftest_ring_submission.c
> @@ -50,7 +50,7 @@ static struct i915_vma *create_wally(struct intel_engine_cs *engine)
>   	} else {
>   		*cs++ = MI_STORE_DWORD_IMM | MI_MEM_VIRTUAL;
>   	}
> -	*cs++ = vma->node.start + 4000;
> +	*cs++ = i915_vma_offset(vma) + 4000;
>   	*cs++ = STACK_MAGIC;
>   
>   	*cs++ = MI_BATCH_BUFFER_END;
> diff --git a/drivers/gpu/drm/i915/gt/selftest_rps.c b/drivers/gpu/drm/i915/gt/selftest_rps.c
> index 39f1b7564170c..6755bbc4ebdac 100644
> --- a/drivers/gpu/drm/i915/gt/selftest_rps.c
> +++ b/drivers/gpu/drm/i915/gt/selftest_rps.c
> @@ -122,14 +122,14 @@ create_spin_counter(struct intel_engine_cs *engine,
>   		if (srm) {
>   			*cs++ = MI_STORE_REGISTER_MEM_GEN8;
>   			*cs++ = i915_mmio_reg_offset(CS_GPR(COUNT));
> -			*cs++ = lower_32_bits(vma->node.start + end * sizeof(*cs));
> -			*cs++ = upper_32_bits(vma->node.start + end * sizeof(*cs));
> +			*cs++ = lower_32_bits(i915_vma_offset(vma) + end * sizeof(*cs));
> +			*cs++ = upper_32_bits(i915_vma_offset(vma) + end * sizeof(*cs));
>   		}
>   	}
>   
>   	*cs++ = MI_BATCH_BUFFER_START_GEN8;
> -	*cs++ = lower_32_bits(vma->node.start + loop * sizeof(*cs));
> -	*cs++ = upper_32_bits(vma->node.start + loop * sizeof(*cs));
> +	*cs++ = lower_32_bits(i915_vma_offset(vma) + loop * sizeof(*cs));
> +	*cs++ = upper_32_bits(i915_vma_offset(vma) + loop * sizeof(*cs));
>   	GEM_BUG_ON(cs - base > end);
>   
>   	i915_gem_object_flush_map(obj);
> @@ -655,7 +655,7 @@ int live_rps_frequency_cs(void *arg)
>   		err = i915_vma_move_to_active(vma, rq, 0);
>   		if (!err)
>   			err = rq->engine->emit_bb_start(rq,
> -							vma->node.start,
> +							i915_vma_offset(vma),
>   							PAGE_SIZE, 0);
>   		i915_request_add(rq);
>   		if (err)
> @@ -794,7 +794,7 @@ int live_rps_frequency_srm(void *arg)
>   		err = i915_vma_move_to_active(vma, rq, 0);
>   		if (!err)
>   			err = rq->engine->emit_bb_start(rq,
> -							vma->node.start,
> +							i915_vma_offset(vma),
>   							PAGE_SIZE, 0);
>   		i915_request_add(rq);
>   		if (err)
> diff --git a/drivers/gpu/drm/i915/gt/selftest_workarounds.c b/drivers/gpu/drm/i915/gt/selftest_workarounds.c
> index 96e3861706d6f..9c5449709161c 100644
> --- a/drivers/gpu/drm/i915/gt/selftest_workarounds.c
> +++ b/drivers/gpu/drm/i915/gt/selftest_workarounds.c
> @@ -521,7 +521,7 @@ static int check_dirty_whitelist(struct intel_context *ce)
>   	for (i = 0; i < engine->whitelist.count; i++) {
>   		u32 reg = i915_mmio_reg_offset(engine->whitelist.list[i].reg);
>   		struct i915_gem_ww_ctx ww;
> -		u64 addr = scratch->node.start;
> +		u64 addr = i915_vma_offset(scratch);
>   		struct i915_request *rq;
>   		u32 srm, lrm, rsvd;
>   		u32 expect;
> @@ -640,7 +640,7 @@ static int check_dirty_whitelist(struct intel_context *ce)
>   			goto err_request;
>   
>   		err = engine->emit_bb_start(rq,
> -					    batch->node.start, PAGE_SIZE,
> +					    i915_vma_offset(batch), PAGE_SIZE,
>   					    0);
>   		if (err)
>   			goto err_request;
> @@ -870,7 +870,7 @@ static int read_whitelisted_registers(struct intel_context *ce,
>   	}
>   
>   	for (i = 0; i < engine->whitelist.count; i++) {
> -		u64 offset = results->node.start + sizeof(u32) * i;
> +		u64 offset = i915_vma_offset(results) + sizeof(u32) * i;
>   		u32 reg = i915_mmio_reg_offset(engine->whitelist.list[i].reg);
>   
>   		/* Clear non priv flags */
> @@ -942,7 +942,7 @@ static int scrub_whitelisted_registers(struct intel_context *ce)
>   		goto err_request;
>   
>   	/* Perform the writes from an unprivileged "user" batch */
> -	err = engine->emit_bb_start(rq, batch->node.start, 0, 0);
> +	err = engine->emit_bb_start(rq, i915_vma_offset(batch), 0, 0);
>   
>   err_request:
>   	err = request_add_sync(rq, err);
> diff --git a/drivers/gpu/drm/i915/i915_cmd_parser.c b/drivers/gpu/drm/i915/i915_cmd_parser.c
> index f93e6122f2478..ddf49c2dbb917 100644
> --- a/drivers/gpu/drm/i915/i915_cmd_parser.c
> +++ b/drivers/gpu/drm/i915/i915_cmd_parser.c
> @@ -1471,8 +1471,8 @@ int intel_engine_cmd_parser(struct intel_engine_cs *engine,
>   		/* Defer failure until attempted use */
>   		jump_whitelist = alloc_whitelist(batch_length);
>   
> -	shadow_addr = gen8_canonical_addr(shadow->node.start);
> -	batch_addr = gen8_canonical_addr(batch->node.start + batch_offset);
> +	shadow_addr = gen8_canonical_addr(i915_vma_offset(shadow));
> +	batch_addr = gen8_canonical_addr(i915_vma_offset(batch) + batch_offset);
>   
>   	/*
>   	 * We use the batch length as size because the shadow object is as
> diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c
> index 6c7ac73b69a52..a356ca490159e 100644
> --- a/drivers/gpu/drm/i915/i915_debugfs.c
> +++ b/drivers/gpu/drm/i915/i915_debugfs.c
> @@ -183,7 +183,7 @@ i915_debugfs_describe_obj(struct seq_file *m, struct drm_i915_gem_object *obj)
>   
>   		seq_printf(m, " (%s offset: %08llx, size: %08llx, pages: %s",
>   			   stringify_vma_type(vma),
> -			   vma->node.start, vma->node.size,
> +			   i915_vma_offset(vma), i915_vma_size(vma),
>   			   stringify_page_sizes(vma->resource->page_sizes_gtt,
>   						NULL, 0));
>   		if (i915_vma_is_ggtt(vma) || i915_vma_is_dpt(vma)) {
> diff --git a/drivers/gpu/drm/i915/i915_perf.c b/drivers/gpu/drm/i915/i915_perf.c
> index 00e09bb18b13b..79a454a17c287 100644
> --- a/drivers/gpu/drm/i915/i915_perf.c
> +++ b/drivers/gpu/drm/i915/i915_perf.c
> @@ -2259,7 +2259,7 @@ emit_oa_config(struct i915_perf_stream *stream,
>   		goto err_add_request;
>   
>   	err = rq->engine->emit_bb_start(rq,
> -					vma->node.start, 0,
> +					i915_vma_offset(vma), 0,
>   					I915_DISPATCH_SECURE);
>   	if (err)
>   		goto err_add_request;
> diff --git a/drivers/gpu/drm/i915/i915_vma.c b/drivers/gpu/drm/i915/i915_vma.c
> index 703fee6b5f752..2232118babeb3 100644
> --- a/drivers/gpu/drm/i915/i915_vma.c
> +++ b/drivers/gpu/drm/i915/i915_vma.c
> @@ -418,8 +418,8 @@ i915_vma_resource_init_from_vma(struct i915_vma_resource *vma_res,
>   	i915_vma_resource_init(vma_res, vma->vm, vma->pages, &vma->page_sizes,
>   			       obj->mm.rsgt, i915_gem_object_is_readonly(obj),
>   			       i915_gem_object_is_lmem(obj), obj->mm.region,
> -			       vma->ops, vma->private, vma->node.start,
> -			       vma->node.size, vma->size);
> +			       vma->ops, vma->private, __i915_vma_offset(vma),
> +			       __i915_vma_size(vma), vma->size);
>   }
>   
>   /**
> @@ -447,7 +447,7 @@ int i915_vma_bind(struct i915_vma *vma,
>   
>   	lockdep_assert_held(&vma->vm->mutex);
>   	GEM_BUG_ON(!drm_mm_node_allocated(&vma->node));
> -	GEM_BUG_ON(vma->size > vma->node.size);
> +	GEM_BUG_ON(vma->size > i915_vma_size(vma));
>   
>   	if (GEM_DEBUG_WARN_ON(range_overflows(vma->node.start,
>   					      vma->node.size,
> @@ -569,8 +569,8 @@ void __iomem *i915_vma_pin_iomap(struct i915_vma *vma)
>   							  vma->obj->base.size);
>   		} else if (i915_vma_is_map_and_fenceable(vma)) {
>   			ptr = io_mapping_map_wc(&i915_vm_to_ggtt(vma->vm)->iomap,
> -						vma->node.start,
> -						vma->node.size);
> +						i915_vma_offset(vma),
> +						i915_vma_size(vma));
>   		} else {
>   			ptr = (void __iomem *)
>   				i915_gem_object_pin_map(vma->obj, I915_MAP_WC);
> @@ -659,22 +659,22 @@ bool i915_vma_misplaced(const struct i915_vma *vma,
>   	if (test_bit(I915_VMA_ERROR_BIT, __i915_vma_flags(vma)))
>   		return true;
>   
> -	if (vma->node.size < size)
> +	if (i915_vma_size(vma) < size)
>   		return true;
>   
>   	GEM_BUG_ON(alignment && !is_power_of_2(alignment));
> -	if (alignment && !IS_ALIGNED(vma->node.start, alignment))
> +	if (alignment && !IS_ALIGNED(i915_vma_offset(vma), alignment))
>   		return true;
>   
>   	if (flags & PIN_MAPPABLE && !i915_vma_is_map_and_fenceable(vma))
>   		return true;
>   
>   	if (flags & PIN_OFFSET_BIAS &&
> -	    vma->node.start < (flags & PIN_OFFSET_MASK))
> +	    i915_vma_offset(vma) < (flags & PIN_OFFSET_MASK))
>   		return true;
>   
>   	if (flags & PIN_OFFSET_FIXED &&
> -	    vma->node.start != (flags & PIN_OFFSET_MASK))
> +	    i915_vma_offset(vma) != (flags & PIN_OFFSET_MASK))
>   		return true;
>   
>   	return false;
> @@ -687,10 +687,11 @@ void __i915_vma_set_map_and_fenceable(struct i915_vma *vma)
>   	GEM_BUG_ON(!i915_vma_is_ggtt(vma));
>   	GEM_BUG_ON(!vma->fence_size);
>   
> -	fenceable = (vma->node.size >= vma->fence_size &&
> -		     IS_ALIGNED(vma->node.start, vma->fence_alignment));
> +	fenceable = (i915_vma_size(vma) >= vma->fence_size &&
> +		     IS_ALIGNED(i915_vma_offset(vma), vma->fence_alignment));
>   
> -	mappable = vma->node.start + vma->fence_size <= i915_vm_to_ggtt(vma->vm)->mappable_end;
> +	mappable = i915_ggtt_offset(vma) + vma->fence_size <=
> +		   i915_vm_to_ggtt(vma->vm)->mappable_end;
>   
>   	if (mappable && fenceable)
>   		set_bit(I915_VMA_CAN_FENCE_BIT, __i915_vma_flags(vma));
> diff --git a/drivers/gpu/drm/i915/i915_vma.h b/drivers/gpu/drm/i915/i915_vma.h
> index 0757977a489bc..3fd4512b1f65f 100644
> --- a/drivers/gpu/drm/i915/i915_vma.h
> +++ b/drivers/gpu/drm/i915/i915_vma.h
> @@ -125,13 +125,58 @@ static inline bool i915_vma_is_closed(const struct i915_vma *vma)
>   	return !list_empty(&vma->closed_link);
>   }
>   
> +/* Internal use only. */
> +static inline u64 __i915_vma_size(const struct i915_vma *vma)
> +{
> +	return vma->node.size;
> +}
> +
> +/**
> + * i915_vma_offset - Obtain the va range size of the vma
> + * @vma: The vma
> + *
> + * GPU virtual address space may be allocated with padding. This
> + * function returns the effective virtual address range size
> + * with padding subtracted.
> + *
> + * Return: The effective virtual address range size.
> + */
> +static inline u64 i915_vma_size(const struct i915_vma *vma)
> +{
> +	GEM_BUG_ON(!drm_mm_node_allocated(&vma->node));
> +	return __i915_vma_size(vma);
> +}
> +
> +/* Internal use only. */
> +static inline u64 __i915_vma_offset(const struct i915_vma *vma)
> +{
> +	return vma->node.start;
> +}
> +
> +/**
> + * i915_vma_offset - Obtain the va offset of the vma
> + * @vma: The vma
> + *
> + * GPU virtual address space may be allocated with padding. This
> + * function returns the effective virtual address offset the gpu
> + * should use to access the bound data.
> + *
> + * Return: The effective virtual address offset.
> + */
> +static inline u64 i915_vma_offset(const struct i915_vma *vma)
> +{
> +	GEM_BUG_ON(!drm_mm_node_allocated(&vma->node));
> +	return __i915_vma_offset(vma);
> +}
> +
>   static inline u32 i915_ggtt_offset(const struct i915_vma *vma)
>   {
>   	GEM_BUG_ON(!i915_vma_is_ggtt(vma));
>   	GEM_BUG_ON(!drm_mm_node_allocated(&vma->node));
> -	GEM_BUG_ON(upper_32_bits(vma->node.start));
> -	GEM_BUG_ON(upper_32_bits(vma->node.start + vma->node.size - 1));
> -	return lower_32_bits(vma->node.start);
> +	GEM_BUG_ON(upper_32_bits(i915_vma_offset(vma)));
> +	GEM_BUG_ON(upper_32_bits(i915_vma_offset(vma) +
> +				 i915_vma_size(vma) - 1));
> +	return lower_32_bits(i915_vma_offset(vma));
>   }
>   
>   static inline u32 i915_ggtt_pin_bias(struct i915_vma *vma)
> diff --git a/drivers/gpu/drm/i915/i915_vma_resource.h b/drivers/gpu/drm/i915/i915_vma_resource.h
> index 06923d1816e7e..54edf3739ca0b 100644
> --- a/drivers/gpu/drm/i915/i915_vma_resource.h
> +++ b/drivers/gpu/drm/i915/i915_vma_resource.h
> @@ -52,8 +52,10 @@ struct i915_page_sizes {
>    * @mr: The memory region of the object pointed to by the vma.
>    * @ops: Pointer to the backend i915_vma_ops.
>    * @private: Bind backend private info.
> - * @start: Offset into the address space of bind range start.
> - * @node_size: Size of the allocated range manager node.
> + * @start: Offset into the address space of bind range start. Note that
> + * this is after any padding that might have been allocated.
> + * @node_size: Size of the allocated range manager node with padding
> + * subtracted.
>    * @vma_size: Bind size.
>    * @page_sizes_gtt: Resulting page sizes from the bind operation.
>    * @bound_flags: Flags indicating binding status.
> @@ -174,8 +176,8 @@ static inline void i915_vma_resource_put(struct i915_vma_resource *vma_res)
>    * @mr: The memory region of the object the vma points to.
>    * @ops: The backend ops.
>    * @private: Bind backend private info.
> - * @start: Offset into the address space of bind range start.
> - * @node_size: Size of the allocated range manager node.
> + * @start: Offset into the address space of bind range start after padding.
> + * @node_size: Size of the allocated range manager node minus padding.
>    * @size: Bind size.
>    *
>    * Initializes a vma resource allocated using i915_vma_resource_alloc().
> diff --git a/drivers/gpu/drm/i915/selftests/i915_request.c b/drivers/gpu/drm/i915/selftests/i915_request.c
> index 0daa8669181da..6fe22b096bdd7 100644
> --- a/drivers/gpu/drm/i915/selftests/i915_request.c
> +++ b/drivers/gpu/drm/i915/selftests/i915_request.c
> @@ -1017,8 +1017,8 @@ empty_request(struct intel_engine_cs *engine,
>   		return request;
>   
>   	err = engine->emit_bb_start(request,
> -				    batch->node.start,
> -				    batch->node.size,
> +				    i915_vma_offset(batch),
> +				    i915_vma_size(batch),
>   				    I915_DISPATCH_SECURE);
>   	if (err)
>   		goto out_request;
> @@ -1138,14 +1138,14 @@ static struct i915_vma *recursive_batch(struct drm_i915_private *i915)
>   
>   	if (ver >= 8) {
>   		*cmd++ = MI_BATCH_BUFFER_START | 1 << 8 | 1;
> -		*cmd++ = lower_32_bits(vma->node.start);
> -		*cmd++ = upper_32_bits(vma->node.start);
> +		*cmd++ = lower_32_bits(i915_vma_offset(vma));
> +		*cmd++ = upper_32_bits(i915_vma_offset(vma));
>   	} else if (ver >= 6) {
>   		*cmd++ = MI_BATCH_BUFFER_START | 1 << 8;
> -		*cmd++ = lower_32_bits(vma->node.start);
> +		*cmd++ = lower_32_bits(i915_vma_offset(vma));
>   	} else {
>   		*cmd++ = MI_BATCH_BUFFER_START | MI_BATCH_GTT;
> -		*cmd++ = lower_32_bits(vma->node.start);
> +		*cmd++ = lower_32_bits(i915_vma_offset(vma));
>   	}
>   	*cmd++ = MI_BATCH_BUFFER_END; /* terminate early in case of error */
>   
> @@ -1227,8 +1227,8 @@ static int live_all_engines(void *arg)
>   		GEM_BUG_ON(err);
>   
>   		err = engine->emit_bb_start(request[idx],
> -					    batch->node.start,
> -					    batch->node.size,
> +					    i915_vma_offset(batch),
> +					    i915_vma_size(batch),
>   					    0);
>   		GEM_BUG_ON(err);
>   		request[idx]->batch = batch;
> @@ -1354,8 +1354,8 @@ static int live_sequential_engines(void *arg)
>   		GEM_BUG_ON(err);
>   
>   		err = engine->emit_bb_start(request[idx],
> -					    batch->node.start,
> -					    batch->node.size,
> +					    i915_vma_offset(batch),
> +					    i915_vma_size(batch),
>   					    0);
>   		GEM_BUG_ON(err);
>   		request[idx]->batch = batch;
> diff --git a/drivers/gpu/drm/i915/selftests/igt_spinner.c b/drivers/gpu/drm/i915/selftests/igt_spinner.c
> index 16978ac597978..618d9386d5549 100644
> --- a/drivers/gpu/drm/i915/selftests/igt_spinner.c
> +++ b/drivers/gpu/drm/i915/selftests/igt_spinner.c
> @@ -116,7 +116,7 @@ static unsigned int seqno_offset(u64 fence)
>   static u64 hws_address(const struct i915_vma *hws,
>   		       const struct i915_request *rq)
>   {
> -	return hws->node.start + seqno_offset(rq->fence.context);
> +	return i915_vma_offset(hws) + seqno_offset(rq->fence.context);
>   }
>   
>   struct i915_request *
> @@ -187,8 +187,8 @@ igt_spinner_create_request(struct igt_spinner *spin,
>   		*batch++ = MI_BATCH_BUFFER_START;
>   	else
>   		*batch++ = MI_BATCH_BUFFER_START | MI_BATCH_GTT;
> -	*batch++ = lower_32_bits(vma->node.start);
> -	*batch++ = upper_32_bits(vma->node.start);
> +	*batch++ = lower_32_bits(i915_vma_offset(vma));
> +	*batch++ = upper_32_bits(i915_vma_offset(vma));
>   
>   	*batch++ = MI_BATCH_BUFFER_END; /* not reached */
>   
> @@ -203,7 +203,7 @@ igt_spinner_create_request(struct igt_spinner *spin,
>   	flags = 0;
>   	if (GRAPHICS_VER(rq->engine->i915) <= 5)
>   		flags |= I915_DISPATCH_SECURE;
> -	err = engine->emit_bb_start(rq, vma->node.start, PAGE_SIZE, flags);
> +	err = engine->emit_bb_start(rq, i915_vma_offset(vma), PAGE_SIZE, flags);
>   
>   cancel_rq:
>   	if (err) {

Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin at intel.com>

Regards,

Tvrtko


More information about the Intel-gfx mailing list