diff options
| author | Chris Wilson <[email protected]> | 2021-12-08 15:34:04 +0000 |
|---|---|---|
| committer | Ramalingam C <[email protected]> | 2021-12-14 09:38:20 +0000 |
| commit | bd56c63ca1d953f035c1a06a0431c106ffada849 (patch) | |
| tree | 8cd7dd8f7f6742224055e601e0a3ecd1294b9a15 /drivers/gpu/drm/i915/intel_memory_region.c | |
| parent | drm/i915: Sanitycheck device iomem on probe (diff) | |
| download | kernel-bd56c63ca1d953f035c1a06a0431c106ffada849.tar.gz kernel-bd56c63ca1d953f035c1a06a0431c106ffada849.zip | |
drm/i915: Test all device memory on probing
This extends the previous sanitychecking of device memory to read/write
all the memory on the device during the device probe, ala memtest86,
as an optional module parameter: i915.memtest=1. This is not expected to
be fast, but a reasonably thorough verfification that the device memory
is accessible and doesn't return bit errors.
v2: Rebased.
Suggested-by: Matthew Auld <[email protected]>
Signed-off-by: Chris Wilson <[email protected]>
Cc: Matthew Auld <[email protected]>
Signed-off-by: Ramalingam C <[email protected]>
Reviewed-by: Matthew Auld <[email protected]>
Reviewed-by: Andi Shyti <[email protected]>
Link: https://patchwork.freedesktop.org/patch/msgid/[email protected]
Diffstat (limited to 'drivers/gpu/drm/i915/intel_memory_region.c')
| -rw-r--r-- | drivers/gpu/drm/i915/intel_memory_region.c | 36 |
1 files changed, 24 insertions, 12 deletions
diff --git a/drivers/gpu/drm/i915/intel_memory_region.c b/drivers/gpu/drm/i915/intel_memory_region.c index 7bfb6df02e72..c70d7e286a51 100644 --- a/drivers/gpu/drm/i915/intel_memory_region.c +++ b/drivers/gpu/drm/i915/intel_memory_region.c @@ -93,9 +93,12 @@ static resource_size_t random_page(resource_size_t last) return prandom_u32_max(last >> PAGE_SHIFT) << PAGE_SHIFT; } -static int iomemtest(struct intel_memory_region *mem, const void *caller) +static int iomemtest(struct intel_memory_region *mem, + bool test_all, + const void *caller) { resource_size_t last = resource_size(&mem->region) - PAGE_SIZE; + resource_size_t page; int err; /* @@ -109,17 +112,25 @@ static int iomemtest(struct intel_memory_region *mem, const void *caller) * a random offset within as a quick spot check for bad memory. */ - err = iopagetest(mem, 0, caller); - if (err) - return err; + if (test_all) { + for (page = 0; page <= last; page += PAGE_SIZE) { + err = iopagetest(mem, page, caller); + if (err) + return err; + } + } else { + err = iopagetest(mem, 0, caller); + if (err) + return err; - err = iopagetest(mem, last, caller); - if (err) - return err; + err = iopagetest(mem, last, caller); + if (err) + return err; - err = iopagetest(mem, random_page(last), caller); - if (err) - return err; + err = iopagetest(mem, random_page(last), caller); + if (err) + return err; + } return 0; } @@ -188,13 +199,14 @@ void intel_memory_region_debug(struct intel_memory_region *mr, static int intel_memory_region_memtest(struct intel_memory_region *mem, void *caller) { + struct drm_i915_private *i915 = mem->i915; int err = 0; if (!mem->io_start) return 0; - if (IS_ENABLED(CONFIG_DRM_I915_DEBUG_GEM)) - err = iomemtest(mem, caller); + if (IS_ENABLED(CONFIG_DRM_I915_DEBUG_GEM) || i915->params.memtest) + err = iomemtest(mem, i915->params.memtest, caller); return err; } |
