[Intel-gfx] [PATCH] drm/i915: Fix errors when there is no free DSM

José Roberto de Souza jose.souza at intel.com
Fri Jan 21 19:24:50 UTC 2022


Part of DSM(data stolen memory) is reserved for HW functions and GUC
and in some platform this reserved block takes the whole DSM leaving
no memory to allocated by i915_gem_object_create_stolen() and friends.

In such cases i915_gem_init_stolen() was not calling drm_mm_init()
and returning 0, causing errors later when testing memory
(intel_memory_region_memtest()) and in intel_memory_regions_hw_probe()
saying setup of memory region failed:

checking generic (91000000 300000) vs hw (23fe7e000000 2000000)
checking generic (91000000 300000) vs hw (237800000000 800000000)
i915 0000:8c:00.0: [drm:i915_gem_init_stolen [i915]] GEN6_STOLEN_RESERVED = 0x00000003ff800185
i915 0000:8c:00.0: [drm:i915_gem_init_stolen [i915]] Memory reserved for graphics device: 8192K, usable: 0K
i915 0000:8c:00.0: Failed to read back from memory region:[mem 0x3ff800000-0x3ff7fffff] at [0x0000237bff800000 + 0x0000000000000000] for i915_gem_stolen_lmem_setup [i915]; wrote 0, read (ff, ff, ff)
i915 0000:8c:00.0: [drm] *ERROR* Failed to setup region 6 (type=3:0), error -22
[drm:intel_gt_setup_lmem [i915]] LMEM: debug trace data region: [0x0-0x2000000]
i915 0000:8c:00.0: [drm:intel_gt_setup_lmem [i915]] Local memory: [mem 0x00000000-0x3faffffff]

Signed-off-by: José Roberto de Souza <jose.souza at intel.com>
---
 drivers/gpu/drm/i915/gem/i915_gem_stolen.c | 9 ++++++---
 drivers/gpu/drm/i915/intel_memory_region.c | 3 +++
 2 files changed, 9 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/i915/gem/i915_gem_stolen.c b/drivers/gpu/drm/i915/gem/i915_gem_stolen.c
index 26975d8577760..6e90357b2d1fd 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_stolen.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_stolen.c
@@ -495,13 +495,16 @@ static int i915_gem_init_stolen(struct intel_memory_region *mem)
 	 * memory, so just consider the start. */
 	reserved_total = stolen_top - reserved_base;
 
+	i915->stolen_usable_size =
+		resource_size(&i915->dsm) - reserved_total;
+
 	drm_dbg(&i915->drm,
 		"Memory reserved for graphics device: %lluK, usable: %lluK\n",
 		(u64)resource_size(&i915->dsm) >> 10,
-		((u64)resource_size(&i915->dsm) - reserved_total) >> 10);
+		(u64)i915->stolen_usable_size >> 10);
 
-	i915->stolen_usable_size =
-		resource_size(&i915->dsm) - reserved_total;
+	if (i915->stolen_usable_size == 0)
+		return -ENOMEM;
 
 	/* Basic memrange allocator for stolen space. */
 	drm_mm_init(&i915->mm.stolen, 0, i915->stolen_usable_size);
diff --git a/drivers/gpu/drm/i915/intel_memory_region.c b/drivers/gpu/drm/i915/intel_memory_region.c
index c70d7e286a512..317d67fa3a36e 100644
--- a/drivers/gpu/drm/i915/intel_memory_region.c
+++ b/drivers/gpu/drm/i915/intel_memory_region.c
@@ -324,6 +324,9 @@ int intel_memory_regions_hw_probe(struct drm_i915_private *i915)
 
 		if (IS_ERR(mem)) {
 			err = PTR_ERR(mem);
+			if (err == -ENOMEM)
+				continue;
+
 			drm_err(&i915->drm,
 				"Failed to setup region(%d) type=%d\n",
 				err, type);
-- 
2.34.1



More information about the Intel-gfx mailing list