summaryrefslogtreecommitdiff
path: root/lib/i915/intel_memory_region.c
diff options
context:
space:
mode:
authorZbigniew Kempczyński <zbigniew.kempczynski@intel.com>2021-12-09 20:48:45 +0100
committerZbigniew Kempczyński <zbigniew.kempczynski@intel.com>2021-12-13 12:37:16 +0100
commitbe84fe4f151bc092e068cab5cd0cd19c34948b40 (patch)
tree554036332d1dbd98bce054a936e5d329ed79e80d /lib/i915/intel_memory_region.c
parentd959199944d67331f0eb7b62768242c88aba7e35 (diff)
lib/i915/intel_memory_region: Add fallback for creating gem bo
For stable kernels we get -ENODEV on integrated where gem_create_ext() call tries to allocate bo in system memory. Instead of asserting this case we can fallback to gem_create() as this allocation can be resolved using legacy call. Signed-off-by: Zbigniew Kempczyński <zbigniew.kempczynski@intel.com> Cc: Petri Latvala <petri.latvala@intel.com> Cc: Ashutosh Dixit <ashutosh.dixit@intel.com> Reviewed-by: Petri Latvala <petri.latvala@intel.com>
Diffstat (limited to 'lib/i915/intel_memory_region.c')
-rw-r--r--lib/i915/intel_memory_region.c17
1 files changed, 16 insertions, 1 deletions
diff --git a/lib/i915/intel_memory_region.c b/lib/i915/intel_memory_region.c
index fd29eec9..2263f198 100644
--- a/lib/i915/intel_memory_region.c
+++ b/lib/i915/intel_memory_region.c
@@ -197,8 +197,23 @@ int __gem_create_in_memory_region_list(int fd, uint32_t *handle, uint64_t *size,
.num_regions = num_regions,
.regions = to_user_pointer(mem_regions),
};
+ int ret;
- return __gem_create_ext(fd, size, handle, &ext_regions.base);
+ ret = __gem_create_ext(fd, size, handle, &ext_regions.base);
+
+ /*
+ * Provide fallback for stable kernels if region passed in the array
+ * can be system memory. In this case we get -ENODEV but still
+ * we're able to allocate gem bo in system memory using legacy call.
+ */
+ if (ret == -ENODEV)
+ for (int i = 0; i < num_regions; i++)
+ if (mem_regions[i].memory_class == I915_MEMORY_CLASS_SYSTEM) {
+ ret = __gem_create(fd, size, handle);
+ break;
+ }
+
+ return ret;
}
/* gem_create_in_memory_region_list: