Skip to content

Commit bd56c63

Browse files
ickleramalingamc
authored andcommitted
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 <matthew.auld@intel.com> Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Cc: Matthew Auld <matthew.auld@intel.com> Signed-off-by: Ramalingam C <ramalingam.c@intel.com> Reviewed-by: Matthew Auld <matthew.auld@intel.com> Reviewed-by: Andi Shyti <andi.shyti@linux.intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20211208153404.27546-4-ramalingam.c@intel.com
1 parent 2e21de9 commit bd56c63

File tree

3 files changed

+28
-12
lines changed

3 files changed

+28
-12
lines changed

drivers/gpu/drm/i915/i915_params.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,9 @@ i915_param_named_unsafe(invert_brightness, int, 0400,
140140
i915_param_named(disable_display, bool, 0400,
141141
"Disable display (default: false)");
142142

143+
i915_param_named(memtest, bool, 0400,
144+
"Perform a read/write test of all device memory on module load (default: off)");
145+
143146
i915_param_named(mmio_debug, int, 0400,
144147
"Enable the MMIO debug code for the first N failures (default: off). "
145148
"This may negatively affect performance.");

drivers/gpu/drm/i915/i915_params.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ struct drm_printer;
6464
param(char *, guc_firmware_path, NULL, 0400) \
6565
param(char *, huc_firmware_path, NULL, 0400) \
6666
param(char *, dmc_firmware_path, NULL, 0400) \
67+
param(bool, memtest, false, 0400) \
6768
param(int, mmio_debug, -IS_ENABLED(CONFIG_DRM_I915_DEBUG_MMIO), 0600) \
6869
param(int, edp_vswing, 0, 0400) \
6970
param(unsigned int, reset, 3, 0600) \

drivers/gpu/drm/i915/intel_memory_region.c

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -93,9 +93,12 @@ static resource_size_t random_page(resource_size_t last)
9393
return prandom_u32_max(last >> PAGE_SHIFT) << PAGE_SHIFT;
9494
}
9595

96-
static int iomemtest(struct intel_memory_region *mem, const void *caller)
96+
static int iomemtest(struct intel_memory_region *mem,
97+
bool test_all,
98+
const void *caller)
9799
{
98100
resource_size_t last = resource_size(&mem->region) - PAGE_SIZE;
101+
resource_size_t page;
99102
int err;
100103

101104
/*
@@ -109,17 +112,25 @@ static int iomemtest(struct intel_memory_region *mem, const void *caller)
109112
* a random offset within as a quick spot check for bad memory.
110113
*/
111114

112-
err = iopagetest(mem, 0, caller);
113-
if (err)
114-
return err;
115+
if (test_all) {
116+
for (page = 0; page <= last; page += PAGE_SIZE) {
117+
err = iopagetest(mem, page, caller);
118+
if (err)
119+
return err;
120+
}
121+
} else {
122+
err = iopagetest(mem, 0, caller);
123+
if (err)
124+
return err;
115125

116-
err = iopagetest(mem, last, caller);
117-
if (err)
118-
return err;
126+
err = iopagetest(mem, last, caller);
127+
if (err)
128+
return err;
119129

120-
err = iopagetest(mem, random_page(last), caller);
121-
if (err)
122-
return err;
130+
err = iopagetest(mem, random_page(last), caller);
131+
if (err)
132+
return err;
133+
}
123134

124135
return 0;
125136
}
@@ -188,13 +199,14 @@ void intel_memory_region_debug(struct intel_memory_region *mr,
188199
static int intel_memory_region_memtest(struct intel_memory_region *mem,
189200
void *caller)
190201
{
202+
struct drm_i915_private *i915 = mem->i915;
191203
int err = 0;
192204

193205
if (!mem->io_start)
194206
return 0;
195207

196-
if (IS_ENABLED(CONFIG_DRM_I915_DEBUG_GEM))
197-
err = iomemtest(mem, caller);
208+
if (IS_ENABLED(CONFIG_DRM_I915_DEBUG_GEM) || i915->params.memtest)
209+
err = iomemtest(mem, i915->params.memtest, caller);
198210

199211
return err;
200212
}

0 commit comments

Comments
 (0)