From 4aecfbf0f4abd6932ae071c27bd8e6c3639b8dd1 Mon Sep 17 00:00:00 2001 From: Jordan Justen Date: Mon, 16 May 2022 02:19:48 -0700 Subject: [PATCH] intel/dev: Add devinfo::mem to store i915 regions information Reworks: * Lionel: Change check on memory region valid to vram size * Jordan: Drop regions.valid (Lionel implemented a fallback) * Jordan: Rename devinfo::regions to devinfo::mem. * Jordan: Add devinfo::mem::use_class_instance * Add mesa_logw for lmem requiring regions. (s-b Lionel) Signed-off-by: Jordan Justen Reviewed-by: Lionel Landwerlin Part-of: --- src/intel/dev/intel_device_info.c | 47 +++++++++++++++++++++++++++++++ src/intel/dev/intel_device_info.h | 12 ++++++++ 2 files changed, 59 insertions(+) diff --git a/src/intel/dev/intel_device_info.c b/src/intel/dev/intel_device_info.c index 286b52b73b6..9a2f6b8ff72 100644 --- a/src/intel/dev/intel_device_info.c +++ b/src/intel/dev/intel_device_info.c @@ -1587,6 +1587,45 @@ query_topology(struct intel_device_info *devinfo, int fd) } +/** + * Reports memory region info, and allows buffers to target system-memory, + * and/or device local memory. + */ +static bool +query_regions(struct intel_device_info *devinfo, int fd) +{ + struct drm_i915_query_memory_regions *meminfo = + intel_i915_query_alloc(fd, DRM_I915_QUERY_MEMORY_REGIONS, NULL); + if (meminfo == NULL) + return false; + + for (int i = 0; i < meminfo->num_regions; i++) { + const struct drm_i915_memory_region_info *mem = &meminfo->regions[i]; + switch (mem->region.memory_class) { + case I915_MEMORY_CLASS_SYSTEM: + devinfo->mem.sram.mem_class = mem->region.memory_class; + devinfo->mem.sram.mem_instance = mem->region.memory_instance; + devinfo->mem.sram.mappable.size = mem->probed_size; + if (mem->unallocated_size != -1) + devinfo->mem.sram.mappable.free = mem->unallocated_size; + break; + case I915_MEMORY_CLASS_DEVICE: + devinfo->mem.vram.mem_class = mem->region.memory_class; + devinfo->mem.vram.mem_instance = mem->region.memory_instance; + devinfo->mem.vram.mappable.size = mem->probed_size; + if (mem->unallocated_size != -1) + devinfo->mem.vram.mappable.free = mem->unallocated_size; + break; + default: + break; + } + } + + free(meminfo); + devinfo->mem.use_class_instance = true; + return true; +} + static int intel_get_aperture_size(int fd, uint64_t *size) { @@ -1931,6 +1970,14 @@ intel_get_device_info_from_fd(int fd, struct intel_device_info *devinfo) getparam_topology(devinfo, fd); } + query_regions(devinfo, fd); + + /* region info is required for lmem support */ + if (devinfo->has_local_mem && !devinfo->mem.use_class_instance) { + mesa_logw("Could not query local memory size."); + return false; + } + if (devinfo->platform == INTEL_PLATFORM_CHV) fixup_chv_device_info(devinfo); diff --git a/src/intel/dev/intel_device_info.h b/src/intel/dev/intel_device_info.h index 0426aa16dc4..cdea46cf2bf 100644 --- a/src/intel/dev/intel_device_info.h +++ b/src/intel/dev/intel_device_info.h @@ -391,6 +391,18 @@ struct intel_device_info * apply_hwconfig is true when the platform should apply hwconfig values */ bool apply_hwconfig; + + struct { + bool use_class_instance; + struct { + uint16_t mem_class; + uint16_t mem_instance; + struct { + uint64_t size; + uint64_t free; + } mappable; + } sram, vram; + } mem; /** @} */ };