From f118ca20758c85da1aaf1792e61aadb298b32a47 Mon Sep 17 00:00:00 2001 From: Jordan Justen Date: Fri, 27 Apr 2018 16:35:28 -0700 Subject: [PATCH] iris/bufmgr: Initialize aux map context for gen12 Reworks: * free gen_buffer in gen_aux_map_buffer_free. (Rafael) * lock around aux_map_bos accesses. (Ken) Signed-off-by: Jordan Justen Reviewed-by: Kenneth Graunke --- src/gallium/drivers/iris/iris_bufmgr.c | 53 ++++++++++++++++++++++++++ src/gallium/drivers/iris/iris_bufmgr.h | 9 +++++ 2 files changed, 62 insertions(+) diff --git a/src/gallium/drivers/iris/iris_bufmgr.c b/src/gallium/drivers/iris/iris_bufmgr.c index 992bbd90b3a..1624257729a 100644 --- a/src/gallium/drivers/iris/iris_bufmgr.c +++ b/src/gallium/drivers/iris/iris_bufmgr.c @@ -51,6 +51,7 @@ #include #include "errno.h" +#include "common/gen_aux_map.h" #include "common/gen_clflush.h" #include "dev/gen_debug.h" #include "common/gen_gem.h" @@ -146,6 +147,8 @@ struct iris_bufmgr { bool has_llc:1; bool bo_reuse:1; + + struct gen_aux_map_context *aux_map_ctx; }; static int bo_set_tiling_internal(struct iris_bo *bo, uint32_t tiling_mode, @@ -1193,6 +1196,12 @@ iris_bo_wait(struct iris_bo *bo, int64_t timeout_ns) void iris_bufmgr_destroy(struct iris_bufmgr *bufmgr) { + /* Free aux-map buffers */ + gen_aux_map_finish(bufmgr->aux_map_ctx); + + /* bufmgr will no longer try to free VMA entries in the aux-map */ + bufmgr->aux_map_ctx = NULL; + mtx_destroy(&bufmgr->lock); /* Free any cached buffer objects we were going to reuse */ @@ -1560,6 +1569,38 @@ iris_gtt_size(int fd) return 0; } +static struct gen_buffer * +gen_aux_map_buffer_alloc(void *driver_ctx, uint32_t size) +{ + struct gen_buffer *buf = malloc(sizeof(struct gen_buffer)); + if (!buf) + return NULL; + + struct iris_bufmgr *bufmgr = (struct iris_bufmgr *)driver_ctx; + + struct iris_bo *bo = + iris_bo_alloc_tiled(bufmgr, "aux-map", size, 64 * 1024, + IRIS_MEMZONE_OTHER, I915_TILING_NONE, 0, 0); + + buf->driver_bo = bo; + buf->gpu = bo->gtt_offset; + buf->gpu_end = buf->gpu + bo->size; + buf->map = iris_bo_map(NULL, bo, MAP_WRITE | MAP_RAW); + return buf; +} + +static void +gen_aux_map_buffer_free(void *driver_ctx, struct gen_buffer *buffer) +{ + iris_bo_unreference((struct iris_bo*)buffer->driver_bo); + free(buffer); +} + +static struct gen_mapped_pinned_buffer_alloc aux_map_allocator = { + .alloc = gen_aux_map_buffer_alloc, + .free = gen_aux_map_buffer_free, +}; + /** * Initializes the GEM buffer manager, which uses the kernel to allocate, map, * and manage map buffer objections. @@ -1627,5 +1668,17 @@ iris_bufmgr_init(struct gen_device_info *devinfo, int fd, bool bo_reuse) bufmgr->handle_table = _mesa_hash_table_create(NULL, key_hash_uint, key_uint_equal); + if (devinfo->gen >= 12) { + bufmgr->aux_map_ctx = gen_aux_map_init(bufmgr, &aux_map_allocator, + devinfo); + assert(bufmgr->aux_map_ctx); + } + return bufmgr; } + +void* +iris_bufmgr_get_aux_map_context(struct iris_bufmgr *bufmgr) +{ + return bufmgr->aux_map_ctx; +} diff --git a/src/gallium/drivers/iris/iris_bufmgr.h b/src/gallium/drivers/iris/iris_bufmgr.h index d5ae9b42ab1..c23cd403023 100644 --- a/src/gallium/drivers/iris/iris_bufmgr.h +++ b/src/gallium/drivers/iris/iris_bufmgr.h @@ -33,6 +33,7 @@ #include "util/list.h" #include "pipe/p_defines.h" +struct iris_batch; struct gen_device_info; struct pipe_debug_callback; @@ -112,6 +113,11 @@ struct iris_bo { */ uint64_t gtt_offset; + /** + * If non-zero, then this bo has an aux-map translation to this address. + */ + uint64_t aux_map_address; + /** * The validation list index for this buffer, or -1 when not in a batch. * Note that a single buffer may be in multiple batches (contexts), and @@ -328,6 +334,9 @@ struct iris_bufmgr *iris_bufmgr_init(struct gen_device_info *devinfo, int fd, struct iris_bo *iris_bo_gem_create_from_name(struct iris_bufmgr *bufmgr, const char *name, unsigned handle); + +void* iris_bufmgr_get_aux_map_context(struct iris_bufmgr *bufmgr); + int iris_bo_wait(struct iris_bo *bo, int64_t timeout_ns); uint32_t iris_create_hw_context(struct iris_bufmgr *bufmgr); -- 2.30.2