Skip to content

Commit

Permalink
drm/i915/selftests: scrub 64K
Browse files Browse the repository at this point in the history
We write all 4K page entries, even when using 64K pages. In order to
verify that the HW isn't cheating by using the 4K PTE instead of the 64K
PTE, we want to remove all the surplus entries. If the HW skipped the
64K PTE, it will read/write into the scratch page instead - which we
detect as missing results during selftests.

v2: much improved commentary (Chris)

Signed-off-by: Matthew Auld <matthew.auld@intel.com>
Cc: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Changbin Du <changbin.du@intel.com>
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Link: https://patchwork.freedesktop.org/patch/msgid/20180511095140.25590-1-matthew.auld@intel.com
  • Loading branch information
Matthew Auld authored and Chris Wilson committed May 13, 2018
1 parent e896d29 commit f79401b
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 0 deletions.
21 changes: 21 additions & 0 deletions drivers/gpu/drm/i915/i915_gem_gtt.c
Original file line number Diff line number Diff line change
Expand Up @@ -1162,6 +1162,27 @@ static void gen8_ppgtt_insert_huge_entries(struct i915_vma *vma,
vaddr[idx.pde] |= GEN8_PDE_IPS_64K;
kunmap_atomic(vaddr);
page_size = I915_GTT_PAGE_SIZE_64K;

/*
* We write all 4K page entries, even when using 64K
* pages. In order to verify that the HW isn't cheating
* by using the 4K PTE instead of the 64K PTE, we want
* to remove all the surplus entries. If the HW skipped
* the 64K PTE, it will read/write into the scratch page
* instead - which we detect as missing results during
* selftests.
*/
if (I915_SELFTEST_ONLY(vma->vm->scrub_64K)) {
u16 i;

encode = pte_encode | vma->vm->scratch_page.daddr;
vaddr = kmap_atomic_px(pd->page_table[idx.pde]);

for (i = 1; i < index; i += 16)
memset64(vaddr + i, encode, 15);

kunmap_atomic(vaddr);
}
}

vma->page_sizes.gtt |= page_size;
Expand Down
1 change: 1 addition & 0 deletions drivers/gpu/drm/i915/i915_gem_gtt.h
Original file line number Diff line number Diff line change
Expand Up @@ -342,6 +342,7 @@ struct i915_address_space {
void (*clear_pages)(struct i915_vma *vma);

I915_SELFTEST_DECLARE(struct fault_attr fault_attr);
I915_SELFTEST_DECLARE(bool scrub_64K);
};

#define i915_is_ggtt(V) (!(V)->file)
Expand Down
3 changes: 3 additions & 0 deletions drivers/gpu/drm/i915/selftests/huge_pages.c
Original file line number Diff line number Diff line change
Expand Up @@ -1757,6 +1757,9 @@ int i915_gem_huge_page_live_selftests(struct drm_i915_private *dev_priv)
goto out_unlock;
}

if (ctx->ppgtt)
ctx->ppgtt->base.scrub_64K = true;

err = i915_subtests(tests, ctx);

out_unlock:
Expand Down

0 comments on commit f79401b

Please sign in to comment.