anv: Use memory info from devinfo

Rework:
 * Jordan: Drop regions.valid (Lionel implemented a fallback)

Signed-off-by: Jordan Justen <jordan.l.justen@intel.com>
Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17075>
This commit is contained in:
Jordan Justen 2022-05-18 09:52:37 -07:00 committed by Marge Bot
parent 4289c9ec13
commit 1505f94397

View file

@ -366,92 +366,35 @@ anv_compute_sys_heap_size(struct anv_physical_device *device,
return available_ram;
}
static VkResult MUST_CHECK
anv_gather_meminfo(struct anv_physical_device *device, int fd, bool update)
{
char sys_mem_regions[sizeof(struct drm_i915_query_memory_regions) +
sizeof(struct drm_i915_memory_region_info)];
struct drm_i915_query_memory_regions *mem_regions =
intel_i915_query_alloc(fd, DRM_I915_QUERY_MEMORY_REGIONS, NULL);
if (mem_regions == NULL) {
if (device->info.has_local_mem) {
return vk_errorf(device, VK_ERROR_INCOMPATIBLE_DRIVER,
"failed to memory regions: %m");
}
uint64_t total_phys;
if (!os_get_total_physical_memory(&total_phys)) {
return vk_errorf(device, VK_ERROR_INITIALIZATION_FAILED,
"failed to get total physical memory: %m");
}
uint64_t available;
if (!os_get_available_system_memory(&available))
available = 0; /* Silently disable VK_EXT_memory_budget */
/* The kernel query failed. Fake it using OS memory queries. This
* should be roughly the same for integrated GPUs.
*/
mem_regions = (void *)sys_mem_regions;
mem_regions->num_regions = 1;
mem_regions->regions[0] = (struct drm_i915_memory_region_info) {
.region.memory_class = I915_MEMORY_CLASS_SYSTEM,
.probed_size = total_phys,
.unallocated_size = available,
};
}
for(int i = 0; i < mem_regions->num_regions; i++) {
struct drm_i915_memory_region_info *info = &mem_regions->regions[i];
struct anv_memregion *region;
switch (info->region.memory_class) {
case I915_MEMORY_CLASS_SYSTEM:
region = &device->sys;
break;
case I915_MEMORY_CLASS_DEVICE:
region = &device->vram;
break;
default:
/* We don't know what kind of memory this is */
continue;
}
uint64_t size = info->probed_size;
if (info->region.memory_class == I915_MEMORY_CLASS_SYSTEM)
size = anv_compute_sys_heap_size(device, size);
uint64_t available = MIN2(size, info->unallocated_size);
if (update) {
assert(region->region.memory_class == info->region.memory_class);
assert(region->region.memory_instance == info->region.memory_instance);
assert(region->size == size);
} else {
region->region = info->region;
region->size = size;
}
region->available = available;
}
if (mem_regions != (void *)sys_mem_regions)
free(mem_regions);
return VK_SUCCESS;
}
static VkResult MUST_CHECK
anv_init_meminfo(struct anv_physical_device *device, int fd)
{
return anv_gather_meminfo(device, fd, false);
const struct intel_device_info *devinfo = &device->info;
device->sys.region.memory_class = devinfo->mem.sram.mem_class;
device->sys.region.memory_instance = devinfo->mem.sram.mem_instance;
device->sys.size =
anv_compute_sys_heap_size(device, devinfo->mem.sram.mappable.size);
device->sys.available = devinfo->mem.sram.mappable.free;
device->vram.region.memory_class = devinfo->mem.vram.mem_class;
device->vram.region.memory_instance =
devinfo->mem.vram.mem_instance;
device->vram.size = devinfo->mem.vram.mappable.size;
device->vram.available = devinfo->mem.vram.mappable.free;
return VK_SUCCESS;
}
static void
anv_update_meminfo(struct anv_physical_device *device, int fd)
{
ASSERTED VkResult result = anv_gather_meminfo(device, fd, true);
assert(result == VK_SUCCESS);
if (!intel_device_info_update_memory_info(&device->info, fd))
return;
const struct intel_device_info *devinfo = &device->info;
device->sys.available = devinfo->mem.sram.mappable.free;
device->vram.available = devinfo->mem.vram.mappable.free;
}