[PATCH v3 6/7] drm/i915/gt: Avoid direct dereferencing of io memory
Balasubramani Vivekanandan
balasubramani.vivekanandan at intel.com
Tue Apr 26 16:51:47 UTC 2022
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 at intel.com>
Cc: Michał Winiarski <michal.winiarski at intel.com>
Signed-off-by: Balasubramani Vivekanandan <balasubramani.vivekanandan at intel.com>
Acked-by: Nirmoy Das <nirmoy.das at 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..7a455583c687 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, 0, 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, 0, 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;
}
--
2.25.1
More information about the dri-devel
mailing list