[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