@@ -3,6 +3,7 @@
* Copyright © 2018 Intel Corporation
*/
+#include <drm/drm_cache.h>
#include <linux/crc32.h>
#include "gem/i915_gem_stolen.h"
@@ -82,7 +83,7 @@ __igt_reset_stolen(struct intel_gt *gt,
for (page = 0; page < num_pages; page++) {
dma_addr_t dma = (dma_addr_t)dsm->start + (page << PAGE_SHIFT);
void __iomem *s;
- void *in;
+ struct iosys_map src_map;
ggtt->vm.insert_page(&ggtt->vm, dma,
ggtt->error_capture.start,
@@ -98,10 +99,9 @@ __igt_reset_stolen(struct intel_gt *gt,
((page + 1) << PAGE_SHIFT) - 1))
memset_io(s, STACK_MAGIC, PAGE_SIZE);
- in = (void __force *)s;
- if (i915_memcpy_from_wc(tmp, in, PAGE_SIZE))
- in = tmp;
- crc[page] = crc32_le(0, in, PAGE_SIZE);
+ iosys_map_set_vaddr_iomem(&src_map, s);
+ drm_memcpy_from_wc_vaddr(tmp, &src_map, PAGE_SIZE);
+ crc[page] = crc32_le(0, tmp, PAGE_SIZE);
io_mapping_unmap(s);
}
@@ -122,7 +122,7 @@ __igt_reset_stolen(struct intel_gt *gt,
for (page = 0; page < num_pages; page++) {
dma_addr_t dma = (dma_addr_t)dsm->start + (page << PAGE_SHIFT);
void __iomem *s;
- void *in;
+ struct iosys_map src_map;
u32 x;
ggtt->vm.insert_page(&ggtt->vm, dma,
@@ -134,10 +134,9 @@ __igt_reset_stolen(struct intel_gt *gt,
ggtt->error_capture.start,
PAGE_SIZE);
- in = (void __force *)s;
- if (i915_memcpy_from_wc(tmp, in, PAGE_SIZE))
- in = tmp;
- x = crc32_le(0, in, PAGE_SIZE);
+ iosys_map_set_vaddr_iomem(&src_map, s);
+ drm_memcpy_from_wc_vaddr(tmp, &src_map, PAGE_SIZE);
+ x = crc32_le(0, tmp, PAGE_SIZE);
if (x != crc[page] &&
!__drm_mm_interval_first(>->i915->mm.stolen,
@@ -146,7 +145,7 @@ __igt_reset_stolen(struct intel_gt *gt,
pr_debug("unused stolen page %pa modified by GPU reset\n",
&page);
if (count++ == 0)
- igt_hexdump(in, PAGE_SIZE);
+ igt_hexdump(tmp, PAGE_SIZE);
max = page;
}
io mapped memory should not be directly dereferenced to ensure portability. io memory should be read/written/copied using helper functions. i915_memcpy_from_wc() function was used to copy the data from io memory to a temporary buffer and pointer to the temporary buffer was passed to CRC calculation function. But i915_memcpy_from_wc() only does a copy if the platform supports fast copy using non-temporal instructions. Otherwise the pointer to io memory was passed for CRC calculation. CRC function will directly dereference io memory and would not work properly on non-x86 platforms. To make it portable, it should be ensured always temporary buffer is used for CRC and not io memory. drm_memcpy_from_wc_vaddr() is now used for copying instead of i915_memcpy_from_wc() for 2 reasons. - i915_memcpy_from_wc() will be deprecated. - drm_memcpy_from_wc_vaddr() will not fail if the fast copy is not supported but uses memcpy_fromio as fallback for copying. Cc: Matthew Brost <matthew.brost@intel.com Cc: Michał Winiarski <michal.winiarski@intel.com> Signed-off-by: Balasubramani Vivekanandan <balasubramani.vivekanandan@intel.com> --- drivers/gpu/drm/i915/gt/selftest_reset.c | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-)