aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/i915/i915_dma.c27
-rw-r--r--drivers/gpu/drm/i915/i915_drv.h4
-rw-r--r--drivers/gpu/drm/i915/i915_params.c4
-rw-r--r--drivers/gpu/drm/i915/i915_params.h1
4 files changed, 36 insertions, 0 deletions
diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c
index 7466e739887d..68592b0de874 100644
--- a/drivers/gpu/drm/i915/i915_dma.c
+++ b/drivers/gpu/drm/i915/i915_dma.c
@@ -50,6 +50,21 @@
50#include <linux/pm_runtime.h> 50#include <linux/pm_runtime.h>
51#include <linux/oom.h> 51#include <linux/oom.h>
52 52
53static unsigned int i915_load_fail_count;
54
55bool __i915_inject_load_failure(const char *func, int line)
56{
57 if (i915_load_fail_count >= i915.inject_load_failure)
58 return false;
59
60 if (++i915_load_fail_count == i915.inject_load_failure) {
61 DRM_INFO("Injecting failure at checkpoint %u [%s:%d]\n",
62 i915.inject_load_failure, func, line);
63 return true;
64 }
65
66 return false;
67}
53 68
54static int i915_getparam(struct drm_device *dev, void *data, 69static int i915_getparam(struct drm_device *dev, void *data,
55 struct drm_file *file_priv) 70 struct drm_file *file_priv)
@@ -370,6 +385,9 @@ static int i915_load_modeset_init(struct drm_device *dev)
370 struct drm_i915_private *dev_priv = dev->dev_private; 385 struct drm_i915_private *dev_priv = dev->dev_private;
371 int ret; 386 int ret;
372 387
388 if (i915_inject_load_failure())
389 return -ENODEV;
390
373 ret = intel_bios_init(dev_priv); 391 ret = intel_bios_init(dev_priv);
374 if (ret) 392 if (ret)
375 DRM_INFO("failed to find VBIOS tables\n"); 393 DRM_INFO("failed to find VBIOS tables\n");
@@ -951,6 +969,9 @@ static int i915_driver_init_early(struct drm_i915_private *dev_priv,
951 struct intel_device_info *device_info; 969 struct intel_device_info *device_info;
952 int ret = 0; 970 int ret = 0;
953 971
972 if (i915_inject_load_failure())
973 return -ENODEV;
974
954 dev_priv->dev = dev; 975 dev_priv->dev = dev;
955 976
956 /* Setup the write-once "constant" device info */ 977 /* Setup the write-once "constant" device info */
@@ -1065,6 +1086,9 @@ static int i915_driver_init_mmio(struct drm_i915_private *dev_priv)
1065 struct drm_device *dev = dev_priv->dev; 1086 struct drm_device *dev = dev_priv->dev;
1066 int ret; 1087 int ret;
1067 1088
1089 if (i915_inject_load_failure())
1090 return -ENODEV;
1091
1068 if (i915_get_bridge_dev(dev)) 1092 if (i915_get_bridge_dev(dev))
1069 return -EIO; 1093 return -EIO;
1070 1094
@@ -1108,6 +1132,9 @@ static int i915_driver_init_hw(struct drm_i915_private *dev_priv)
1108 uint32_t aperture_size; 1132 uint32_t aperture_size;
1109 int ret; 1133 int ret;
1110 1134
1135 if (i915_inject_load_failure())
1136 return -ENODEV;
1137
1111 intel_device_info_runtime_init(dev); 1138 intel_device_info_runtime_init(dev);
1112 1139
1113 ret = i915_gem_gtt_init(dev); 1140 ret = i915_gem_gtt_init(dev);
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index e6d4b1ce130e..00c41a4bde2a 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -98,6 +98,10 @@
98#define I915_STATE_WARN_ON(x) \ 98#define I915_STATE_WARN_ON(x) \
99 I915_STATE_WARN((x), "%s", "WARN_ON(" __stringify(x) ")") 99 I915_STATE_WARN((x), "%s", "WARN_ON(" __stringify(x) ")")
100 100
101bool __i915_inject_load_failure(const char *func, int line);
102#define i915_inject_load_failure() \
103 __i915_inject_load_failure(__func__, __LINE__)
104
101static inline const char *yesno(bool v) 105static inline const char *yesno(bool v)
102{ 106{
103 return v ? "yes" : "no"; 107 return v ? "yes" : "no";
diff --git a/drivers/gpu/drm/i915/i915_params.c b/drivers/gpu/drm/i915/i915_params.c
index 97691f1f679c..1779f02e6df8 100644
--- a/drivers/gpu/drm/i915/i915_params.c
+++ b/drivers/gpu/drm/i915/i915_params.c
@@ -57,6 +57,7 @@ struct i915_params i915 __read_mostly = {
57 .enable_guc_submission = false, 57 .enable_guc_submission = false,
58 .guc_log_level = -1, 58 .guc_log_level = -1,
59 .enable_dp_mst = true, 59 .enable_dp_mst = true,
60 .inject_load_failure = 0,
60}; 61};
61 62
62module_param_named(modeset, i915.modeset, int, 0400); 63module_param_named(modeset, i915.modeset, int, 0400);
@@ -206,3 +207,6 @@ MODULE_PARM_DESC(guc_log_level,
206module_param_named_unsafe(enable_dp_mst, i915.enable_dp_mst, bool, 0600); 207module_param_named_unsafe(enable_dp_mst, i915.enable_dp_mst, bool, 0600);
207MODULE_PARM_DESC(enable_dp_mst, 208MODULE_PARM_DESC(enable_dp_mst,
208 "Enable multi-stream transport (MST) for new DisplayPort sinks. (default: true)"); 209 "Enable multi-stream transport (MST) for new DisplayPort sinks. (default: true)");
210module_param_named_unsafe(inject_load_failure, i915.inject_load_failure, uint, 0400);
211MODULE_PARM_DESC(inject_load_failure,
212 "Force an error after a number of failure check points (0:disabled (default), N:force failure at the Nth failure check point)");
diff --git a/drivers/gpu/drm/i915/i915_params.h b/drivers/gpu/drm/i915/i915_params.h
index 87153b0199cd..02bc27804291 100644
--- a/drivers/gpu/drm/i915/i915_params.h
+++ b/drivers/gpu/drm/i915/i915_params.h
@@ -49,6 +49,7 @@ struct i915_params {
49 int use_mmio_flip; 49 int use_mmio_flip;
50 int mmio_debug; 50 int mmio_debug;
51 int edp_vswing; 51 int edp_vswing;
52 unsigned int inject_load_failure;
52 /* leave bools at the end to not create holes */ 53 /* leave bools at the end to not create holes */
53 bool enable_hangcheck; 54 bool enable_hangcheck;
54 bool fastboot; 55 bool fastboot;