Skip capturing any lmem pages that can't be copied using the CPU. This
in now only best effort on platforms that have small BAR.

Testcase: igt@gem-exec-capture@capture-invisible
Signed-off-by: Matthew Auld <matthew.a...@intel.com>
Cc: Thomas Hellström <thomas.hellst...@linux.intel.com>
Cc: Lionel Landwerlin <lionel.g.landwer...@intel.com>
Cc: Tvrtko Ursulin <tvrtko.ursu...@linux.intel.com>
Cc: Jon Bloomfield <jon.bloomfi...@intel.com>
Cc: Daniel Vetter <daniel.vet...@ffwll.ch>
Cc: Jordan Justen <jordan.l.jus...@intel.com>
Cc: Kenneth Graunke <kenn...@whitecape.org>
Cc: Akeem G Abodunrin <akeem.g.abodun...@intel.com>
Reviewed-by: Nirmoy Das <nirmoy....@intel.com>
Reviewed-by: Thomas Hellström <thomas.hellst...@linux.intel.com>
---
 drivers/gpu/drm/i915/i915_gpu_error.c | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_gpu_error.c 
b/drivers/gpu/drm/i915/i915_gpu_error.c
index f9b1969ed7ed..52ea13fee015 100644
--- a/drivers/gpu/drm/i915/i915_gpu_error.c
+++ b/drivers/gpu/drm/i915/i915_gpu_error.c
@@ -1129,11 +1129,15 @@ i915_vma_coredump_create(const struct intel_gt *gt,
                dma_addr_t dma;
 
                for_each_sgt_daddr(dma, iter, vma_res->bi.pages) {
+                       dma_addr_t offset = dma - mem->region.start;
                        void __iomem *s;
 
-                       s = io_mapping_map_wc(&mem->iomap,
-                                             dma - mem->region.start,
-                                             PAGE_SIZE);
+                       if (offset + PAGE_SIZE > mem->io_size) {
+                               ret = -EINVAL;
+                               break;
+                       }
+
+                       s = io_mapping_map_wc(&mem->iomap, offset, PAGE_SIZE);
                        ret = compress_page(compress,
                                            (void __force *)s, dst,
                                            true);
-- 
2.36.1

Reply via email to