diff options
-rw-r--r-- | drivers/gpu/drm/i915/i915_dma.c | 27 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_drv.h | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_params.c | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_params.h | 1 |
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 | ||
53 | static unsigned int i915_load_fail_count; | ||
54 | |||
55 | bool __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 | ||
54 | static int i915_getparam(struct drm_device *dev, void *data, | 69 | static 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 | ||
101 | bool __i915_inject_load_failure(const char *func, int line); | ||
102 | #define i915_inject_load_failure() \ | ||
103 | __i915_inject_load_failure(__func__, __LINE__) | ||
104 | |||
101 | static inline const char *yesno(bool v) | 105 | static 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 | ||
62 | module_param_named(modeset, i915.modeset, int, 0400); | 63 | module_param_named(modeset, i915.modeset, int, 0400); |
@@ -206,3 +207,6 @@ MODULE_PARM_DESC(guc_log_level, | |||
206 | module_param_named_unsafe(enable_dp_mst, i915.enable_dp_mst, bool, 0600); | 207 | module_param_named_unsafe(enable_dp_mst, i915.enable_dp_mst, bool, 0600); |
207 | MODULE_PARM_DESC(enable_dp_mst, | 208 | MODULE_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)"); |
210 | module_param_named_unsafe(inject_load_failure, i915.inject_load_failure, uint, 0400); | ||
211 | MODULE_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; |