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.br...@intel.com>
Cc: Michał Winiarski <michal.winiar...@intel.com>

Signed-off-by: Balasubramani Vivekanandan <balasubramani.vivekanan...@intel.com>
---
 drivers/gpu/drm/i915/gt/selftest_reset.c | 21 ++++++++++-----------
 1 file changed, 10 insertions(+), 11 deletions(-)

diff --git a/drivers/gpu/drm/i915/gt/selftest_reset.c 
b/drivers/gpu/drm/i915/gt/selftest_reset.c
index 37c38bdd5f47..79d2bd7ef3b9 100644
--- a/drivers/gpu/drm/i915/gt/selftest_reset.c
+++ b/drivers/gpu/drm/i915/gt/selftest_reset.c
@@ -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(&gt->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;
                }
 
-- 
2.25.1

Reply via email to