[PATCH] dbg-live_objects

Chris Wilson chris at chris-wilson.co.uk
Mon Jul 9 11:42:15 UTC 2018


---
 .../gpu/drm/i915/selftests/i915_gem_object.c  | 67 ++++++++++++++++++-
 1 file changed, 66 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/i915/selftests/i915_gem_object.c b/drivers/gpu/drm/i915/selftests/i915_gem_object.c
index f4a5099c75b5..02c2f00a95c8 100644
--- a/drivers/gpu/drm/i915/selftests/i915_gem_object.c
+++ b/drivers/gpu/drm/i915/selftests/i915_gem_object.c
@@ -173,6 +173,8 @@ static u64 tiled_offset(const struct tile *tile, u64 v)
 		const unsigned int ytile_span = 16;
 		const unsigned int ytile_height = 512;
 
+pr_info("(%llu, %llu) + %llu\n", x, y, v);
+
 		v += y * ytile_span;
 		v += div64_u64_rem(x, ytile_span, &x) * ytile_height;
 		v += x;
@@ -218,6 +220,24 @@ static int check_partial_mapping(struct drm_i915_gem_object *obj,
 			__func__, tile->tiling, tile->stride))
 		return -EINTR;
 
+	err = i915_gem_object_set_to_cpu_domain(obj, true);
+	if (err)
+		return err;
+
+	for (page = 0; page < nreal; page++) {
+		struct page *p;
+		u32 *cpu;
+
+		p = i915_gem_object_get_page(obj, page);
+		if (IS_ERR(p)) {
+			return PTR_ERR(p);
+		}
+
+		cpu = kmap(p);
+		clear_page(cpu);
+		kunmap(p);
+	}
+
 	err = i915_gem_object_set_tiling(obj, tile->tiling, tile->stride);
 	if (err) {
 		pr_err("Failed to set tiling mode=%u, stride=%u, err=%d\n",
@@ -293,8 +313,53 @@ static int check_partial_mapping(struct drm_i915_gem_object *obj,
 		*cpu = 0;
 		drm_clflush_virt_range(cpu, sizeof(*cpu));
 		kunmap(p);
-		if (err)
+
+		if (err) {
+			const unsigned long rowsize = 8 * sizeof(u32);
+			const void *prev = NULL;
+			bool skip = false;
+			u32 stash[8];
+
+			for (page = 0; page < nreal; page++) {
+				struct page *p;
+				unsigned long pos;
+				void *cpu;
+
+				p = i915_gem_object_get_page(obj, page);
+				if (IS_ERR(p))
+					break;
+
+				cpu = kmap(p);
+
+				for (pos = 0; pos < PAGE_SIZE; pos += rowsize) {
+					char line[128];
+
+					if (prev && !memcmp(prev, cpu + pos, rowsize)) {
+						if (!skip) {
+							pr_info("*\n");
+							skip = true;
+						}
+						continue;
+					}
+
+					hex_dump_to_buffer(cpu + pos, PAGE_SIZE - pos,
+							   rowsize, sizeof(u32),
+							   line, sizeof(line),
+							   false);
+					pr_info("[%08lx] %s\n", (page << PAGE_SHIFT) + pos, line);
+					prev = cpu + pos;
+					skip = false;
+				}
+
+				if (prev != stash) {
+					memcpy(stash, prev, sizeof(stash));
+					prev = stash;
+				}
+				kunmap(p);
+			}
+
 			return err;
+		}
 
 		i915_vma_destroy(vma);
 	}
-- 
2.18.0



More information about the Intel-gfx-trybot mailing list