iris: Replace bo->real.local with bo->real.heap

We'll want to describe more than two placement options for BOs. Switch
to using the more flexible heap enum.

Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14012>
This commit is contained in:
Nanley Chery 2021-12-01 11:28:31 -05:00 committed by Marge Bot
parent f93892c5d3
commit 14ebd81ee3
3 changed files with 23 additions and 14 deletions

View File

@ -113,7 +113,7 @@ dump_bo_list(struct iris_batch *batch)
backing->gem_handle, backing->gem_handle,
bo->name, bo->name,
bo->address, bo->address,
backing->real.local ? "local" : "system", iris_heap_to_string[backing->real.heap],
bo->size, bo->size,
bo->refcount, bo->refcount,
written ? " write" : "", written ? " write" : "",

View File

@ -171,12 +171,6 @@ struct iris_memregion {
#define NUM_SLAB_ALLOCATORS 3 #define NUM_SLAB_ALLOCATORS 3
enum iris_heap {
IRIS_HEAP_SYSTEM_MEMORY,
IRIS_HEAP_DEVICE_LOCAL,
IRIS_HEAP_MAX,
};
struct iris_slab { struct iris_slab {
struct pb_slab base; struct pb_slab base;
@ -960,7 +954,7 @@ alloc_fresh_bo(struct iris_bufmgr *bufmgr, uint64_t bo_size, bool local)
bo->bufmgr = bufmgr; bo->bufmgr = bufmgr;
bo->size = bo_size; bo->size = bo_size;
bo->idle = true; bo->idle = true;
bo->real.local = local; bo->real.heap = local ? IRIS_HEAP_DEVICE_LOCAL : IRIS_HEAP_SYSTEM_MEMORY;
if (bufmgr->vram.size == 0) { if (bufmgr->vram.size == 0) {
/* Calling set_domain() will allocate pages for the BO outside of the /* Calling set_domain() will allocate pages for the BO outside of the
@ -979,6 +973,12 @@ alloc_fresh_bo(struct iris_bufmgr *bufmgr, uint64_t bo_size, bool local)
return bo; return bo;
} }
const char *
iris_heap_to_string[IRIS_HEAP_MAX] = {
[IRIS_HEAP_SYSTEM_MEMORY] = "system",
[IRIS_HEAP_DEVICE_LOCAL] = "local",
};
struct iris_bo * struct iris_bo *
iris_bo_alloc(struct iris_bufmgr *bufmgr, iris_bo_alloc(struct iris_bufmgr *bufmgr,
const char *name, const char *name,
@ -1076,7 +1076,7 @@ iris_bo_alloc(struct iris_bufmgr *bufmgr,
} }
DBG("bo_create: buf %d (%s) (%s memzone) (%s) %llub\n", bo->gem_handle, DBG("bo_create: buf %d (%s) (%s memzone) (%s) %llub\n", bo->gem_handle,
bo->name, memzone_name(memzone), bo->real.local ? "local" : "system", bo->name, memzone_name(memzone), iris_heap_to_string[bo->real.heap],
(unsigned long long) size); (unsigned long long) size);
return bo; return bo;
@ -1351,7 +1351,8 @@ bo_unreference_final(struct iris_bo *bo, time_t time)
bucket = NULL; bucket = NULL;
if (bo->real.reusable) if (bo->real.reusable)
bucket = bucket_for_size(bufmgr, bo->size, bo->real.local); bucket = bucket_for_size(bufmgr, bo->size,
bo->real.heap != IRIS_HEAP_SYSTEM_MEMORY);
/* Put the buffer into our internal cache for reuse if we can. */ /* Put the buffer into our internal cache for reuse if we can. */
if (bucket && iris_bo_madvise(bo, I915_MADV_DONTNEED)) { if (bucket && iris_bo_madvise(bo, I915_MADV_DONTNEED)) {
bo->real.free_time = time; bo->real.free_time = time;
@ -1478,7 +1479,7 @@ iris_bo_gem_mmap_offset(struct pipe_debug_callback *dbg, struct iris_bo *bo)
* across PCIe, it's always snooped. The only caching mode allowed by * across PCIe, it's always snooped. The only caching mode allowed by
* DG1 hardware for LMEM is WC. * DG1 hardware for LMEM is WC.
*/ */
if (bo->real.local) if (bo->real.heap != IRIS_HEAP_SYSTEM_MEMORY)
assert(bo->real.mmap_mode == IRIS_MMAP_WC); assert(bo->real.mmap_mode == IRIS_MMAP_WC);
else else
assert(bo->real.mmap_mode == IRIS_MMAP_WB); assert(bo->real.mmap_mode == IRIS_MMAP_WB);

View File

@ -137,6 +137,14 @@ enum iris_mmap_mode {
IRIS_MMAP_WB, /**< Write-back mapping with CPU caches enabled */ IRIS_MMAP_WB, /**< Write-back mapping with CPU caches enabled */
}; };
enum iris_heap {
IRIS_HEAP_SYSTEM_MEMORY,
IRIS_HEAP_DEVICE_LOCAL,
IRIS_HEAP_MAX,
};
extern const char *iris_heap_to_string[];
#define IRIS_BATCH_COUNT 2 #define IRIS_BATCH_COUNT 2
struct iris_bo_screen_deps { struct iris_bo_screen_deps {
@ -244,6 +252,9 @@ struct iris_bo {
/** The mmap coherency mode selected at BO allocation time */ /** The mmap coherency mode selected at BO allocation time */
enum iris_mmap_mode mmap_mode; enum iris_mmap_mode mmap_mode;
/** The heap selected at BO allocation time */
enum iris_heap heap;
/** Was this buffer imported from an external client? */ /** Was this buffer imported from an external client? */
bool imported; bool imported;
@ -255,9 +266,6 @@ struct iris_bo {
/** Boolean of whether this buffer points into user memory */ /** Boolean of whether this buffer points into user memory */
bool userptr; bool userptr;
/** Boolean of whether this was allocated from local memory */
bool local;
} real; } real;
struct { struct {
struct pb_slab_entry entry; struct pb_slab_entry entry;