[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