Commit e2c719b7 authored by Rob Clark's avatar Rob Clark Committed by Daniel Vetter

drm/i915: tame the chattermouth (v2)

Many distro's have mechanism in place to collect and automatically file
bugs for failed WARN()s.  And since i915 has a lot of hw state sanity
checks which result in WARN(), it generates quite a lot of noise which
is somewhat disconcerting to the end user.

Separate out the internal hw-is-in-the-state-I-expected checks into
I915_STATE_WARN()s and allow configuration via i915.verbose_checks module
param about whether this will generate a full blown stacktrace or just
DRM_ERROR().  The new moduleparam defaults to true, so by default there
is no change in behavior.  And even when disabled, you will still get
an error message logged.

v2: paint the macro names blue, clarify that the default behavior
    remains the same as before
Signed-off-by: default avatarRob Clark <robdclark@gmail.com>
Acked-by: default avatarJani Nikula <jani.nikula@intel.com>
Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
parent e6c1abb7
...@@ -72,6 +72,35 @@ ...@@ -72,6 +72,35 @@
#define MISSING_CASE(x) WARN(1, "Missing switch case (%lu) in %s\n", \ #define MISSING_CASE(x) WARN(1, "Missing switch case (%lu) in %s\n", \
(long) (x), __func__); (long) (x), __func__);
/* Use I915_STATE_WARN(x) and I915_STATE_WARN_ON() (rather than WARN() and
* WARN_ON()) for hw state sanity checks to check for unexpected conditions
* which may not necessarily be a user visible problem. This will either
* WARN() or DRM_ERROR() depending on the verbose_checks moduleparam, to
* enable distros and users to tailor their preferred amount of i915 abrt
* spam.
*/
#define I915_STATE_WARN(condition, format...) ({ \
int __ret_warn_on = !!(condition); \
if (unlikely(__ret_warn_on)) { \
if (i915.verbose_state_checks) \
__WARN_printf(format); \
else \
DRM_ERROR(format); \
} \
unlikely(__ret_warn_on); \
})
#define I915_STATE_WARN_ON(condition) ({ \
int __ret_warn_on = !!(condition); \
if (unlikely(__ret_warn_on)) { \
if (i915.verbose_state_checks) \
__WARN_printf("WARN_ON(" #condition ")\n"); \
else \
DRM_ERROR("WARN_ON(" #condition ")\n"); \
} \
unlikely(__ret_warn_on); \
})
enum pipe { enum pipe {
INVALID_PIPE = -1, INVALID_PIPE = -1,
PIPE_A = 0, PIPE_A = 0,
...@@ -2401,6 +2430,7 @@ struct i915_params { ...@@ -2401,6 +2430,7 @@ struct i915_params {
bool disable_vtd_wa; bool disable_vtd_wa;
int use_mmio_flip; int use_mmio_flip;
bool mmio_debug; bool mmio_debug;
bool verbose_state_checks;
}; };
extern struct i915_params i915 __read_mostly; extern struct i915_params i915 __read_mostly;
......
...@@ -51,6 +51,7 @@ struct i915_params i915 __read_mostly = { ...@@ -51,6 +51,7 @@ struct i915_params i915 __read_mostly = {
.disable_vtd_wa = 0, .disable_vtd_wa = 0,
.use_mmio_flip = 0, .use_mmio_flip = 0,
.mmio_debug = 0, .mmio_debug = 0,
.verbose_state_checks = 1,
}; };
module_param_named(modeset, i915.modeset, int, 0400); module_param_named(modeset, i915.modeset, int, 0400);
...@@ -173,3 +174,7 @@ module_param_named(mmio_debug, i915.mmio_debug, bool, 0600); ...@@ -173,3 +174,7 @@ module_param_named(mmio_debug, i915.mmio_debug, bool, 0600);
MODULE_PARM_DESC(mmio_debug, MODULE_PARM_DESC(mmio_debug,
"Enable the MMIO debug code (default: false). This may negatively " "Enable the MMIO debug code (default: false). This may negatively "
"affect performance."); "affect performance.");
module_param_named(verbose_state_checks, i915.verbose_state_checks, bool, 0600);
MODULE_PARM_DESC(verbose_state_checks,
"Enable verbose logs (ie. WARN_ON()) in case of unexpected hw state conditions.");
This diff is collapsed.
...@@ -1558,7 +1558,7 @@ void intel_edp_panel_vdd_on(struct intel_dp *intel_dp) ...@@ -1558,7 +1558,7 @@ void intel_edp_panel_vdd_on(struct intel_dp *intel_dp)
vdd = edp_panel_vdd_on(intel_dp); vdd = edp_panel_vdd_on(intel_dp);
pps_unlock(intel_dp); pps_unlock(intel_dp);
WARN(!vdd, "eDP port %c VDD already requested on\n", I915_STATE_WARN(!vdd, "eDP port %c VDD already requested on\n",
port_name(dp_to_dig_port(intel_dp)->port)); port_name(dp_to_dig_port(intel_dp)->port));
} }
...@@ -1642,7 +1642,7 @@ static void edp_panel_vdd_off(struct intel_dp *intel_dp, bool sync) ...@@ -1642,7 +1642,7 @@ static void edp_panel_vdd_off(struct intel_dp *intel_dp, bool sync)
if (!is_edp(intel_dp)) if (!is_edp(intel_dp))
return; return;
WARN(!intel_dp->want_panel_vdd, "eDP port %c VDD not forced on", I915_STATE_WARN(!intel_dp->want_panel_vdd, "eDP port %c VDD not forced on",
port_name(dp_to_dig_port(intel_dp)->port)); port_name(dp_to_dig_port(intel_dp)->port));
intel_dp->want_panel_vdd = false; intel_dp->want_panel_vdd = false;
......
...@@ -633,7 +633,7 @@ static void check_power_well_state(struct drm_i915_private *dev_priv, ...@@ -633,7 +633,7 @@ static void check_power_well_state(struct drm_i915_private *dev_priv,
return; return;
mismatch: mismatch:
WARN(1, "state mismatch for '%s' (always_on %d hw state %d use-count %d disable_power_well %d\n", I915_STATE_WARN(1, "state mismatch for '%s' (always_on %d hw state %d use-count %d disable_power_well %d\n",
power_well->name, power_well->always_on, enabled, power_well->name, power_well->always_on, enabled,
power_well->count, i915.disable_power_well); power_well->count, i915.disable_power_well);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment