[igt-dev] [PATCH i-g-t 1/1] lib/intel_allocator: Query exact gtt size

Zbigniew Kempczyński zbigniew.kempczynski at intel.com
Mon Sep 18 07:39:49 UTC 2023


On Thu, Sep 14, 2023 at 10:23:32AM -0700, Jonathan Cavitt wrote:
> Use the gem_context_get_param functionality to query the exact gtt size
> for each vm in the intel_allocator.  This replaces the fixed declaration
> using the GEN8_GTT_ADDRESS_WIDTH.
> 
> Signed-off-by: Jonathan Cavitt <jonathan.cavitt at intel.com>
> Suggested-by: Chris Wilson <chris.p.wilson at linux.intel.com>
> ---
>  lib/intel_allocator.h        | 11 +++++++++++
>  lib/intel_allocator_simple.c | 10 +++++-----
>  2 files changed, 16 insertions(+), 5 deletions(-)
> 
> diff --git a/lib/intel_allocator.h b/lib/intel_allocator.h
> index f9ff7f1cc9..cfe20bf8aa 100644
> --- a/lib/intel_allocator.h
> +++ b/lib/intel_allocator.h
> @@ -12,6 +12,7 @@
>  #include <stdint.h>
>  #include <stdatomic.h>
>  #include "i915/gem_submission.h"
> +#include "i915/gem_context.h"
>  #include "intel_reg.h"
>  
>  /**
> @@ -275,6 +276,16 @@ static inline uint64_t get_offset(uint64_t ahnd, uint32_t handle,
>  	return intel_allocator_alloc(ahnd, handle, size, alignment);
>  }
>  
> +static inline uint64_t get_gtt_size(int fd)
> +{
> +	struct drm_i915_gem_context_param p = {
> +		.param = I915_CONTEXT_PARAM_GTT_SIZE
> +	};
> +
> +	gem_context_get_param(fd, &p);
> +	return p.value;
> +}
> +
>  static inline bool put_offset(uint64_t ahnd, uint32_t handle)
>  {
>  	if (!ahnd)
> diff --git a/lib/intel_allocator_simple.c b/lib/intel_allocator_simple.c
> index 3d5e45870e..137885a88b 100644
> --- a/lib/intel_allocator_simple.c
> +++ b/lib/intel_allocator_simple.c
> @@ -459,9 +459,9 @@ static bool intel_allocator_simple_is_allocated(struct intel_allocator *ial,
>  	return same;
>  }
>  
> -static uint64_t get_size(uint64_t start, uint64_t end)
> +static uint64_t get_size(int fd, uint64_t start, uint64_t end)
>  {
> -	end = end ? end : 1ull << GEN8_GTT_ADDRESS_WIDTH;
> +	end = end ? end : get_gtt_size(fd);

Yes, this definitely requires rework to handle different vm address
width. Take a look to CANONICAL() and DECANONICAL(). I've also noticed
some instructions are not 57-bit (pvc) compatibile so it will be
hard to make this generic.

--
Zbigniew

>  
>  	return end - start;
>  }
> @@ -485,7 +485,7 @@ static bool intel_allocator_simple_reserve(struct intel_allocator *ial,
>  	start = DECANONICAL(start);
>  	end = DECANONICAL(end);
>  	igt_assert(end > start || end == 0);
> -	size = get_size(start, end);
> +	size = get_size(ial->fd, start, end);
>  	igt_assert(start + size <= ials->end);
>  	igt_assert(start >= ials->start);
>  
> @@ -526,7 +526,7 @@ static bool intel_allocator_simple_unreserve(struct intel_allocator *ial,
>  	start = DECANONICAL(start);
>  	end = DECANONICAL(end);
>  	igt_assert(end > start || end == 0);
> -	size = get_size(start, end);
> +	size = get_size(ial->fd, start, end);
>  
>  	entry = igt_map_search_entry(ials->reserved, &start);
>  
> @@ -574,7 +574,7 @@ static bool intel_allocator_simple_is_reserved(struct intel_allocator *ial,
>  	start = DECANONICAL(start);
>  	end = DECANONICAL(end);
>  	igt_assert(end > start || end == 0);
> -	size = get_size(start, end);
> +	size = get_size(ial->fd, start, end);
>  
>  	rec = igt_map_search(ials->reserved, &start);
>  
> -- 
> 2.25.1
> 


More information about the igt-dev mailing list