1 // SPDX-License-Identifier: MIT
3 * Copyright © 2019 Intel Corporation
6 #include <drm/drm_drv.h>
9 #include "i915_utils.h"
11 #define FDO_BUG_MSG "Please file a bug on drm/i915; see " FDO_BUG_URL " for details."
14 __i915_printk(struct drm_i915_private
*dev_priv
, const char *level
,
17 static bool shown_bug_once
;
18 struct device
*kdev
= dev_priv
->drm
.dev
;
19 bool is_error
= level
[1] <= KERN_ERR
[1];
20 bool is_debug
= level
[1] == KERN_DEBUG
[1];
24 if (is_debug
&& !drm_debug_enabled(DRM_UT_DRIVER
))
33 dev_printk(level
, kdev
, "%pV", &vaf
);
35 dev_printk(level
, kdev
, "[" DRM_NAME
":%ps] %pV",
36 __builtin_return_address(0), &vaf
);
40 if (is_error
&& !shown_bug_once
) {
42 * Ask the user to file a bug report for the error, except
43 * if they may have caused the bug by fiddling with unsafe
46 if (!test_taint(TAINT_USER
))
47 dev_notice(kdev
, "%s", FDO_BUG_MSG
);
48 shown_bug_once
= true;
52 void add_taint_for_CI(struct drm_i915_private
*i915
, unsigned int taint
)
54 __i915_printk(i915
, KERN_NOTICE
, "CI tainted:%#x by %pS\n",
55 taint
, (void *)_RET_IP_
);
57 /* Failures that occur during fault injection testing are expected */
58 if (!i915_error_injected())
59 __add_taint_for_CI(taint
);
62 #if IS_ENABLED(CONFIG_DRM_I915_DEBUG)
63 static unsigned int i915_probe_fail_count
;
65 int __i915_inject_probe_error(struct drm_i915_private
*i915
, int err
,
66 const char *func
, int line
)
68 if (i915_probe_fail_count
>= i915_modparams
.inject_probe_failure
)
71 if (++i915_probe_fail_count
< i915_modparams
.inject_probe_failure
)
74 __i915_printk(i915
, KERN_INFO
,
75 "Injecting failure %d at checkpoint %u [%s:%d]\n",
76 err
, i915_modparams
.inject_probe_failure
, func
, line
);
77 i915_modparams
.inject_probe_failure
= 0;
81 bool i915_error_injected(void)
83 return i915_probe_fail_count
&& !i915_modparams
.inject_probe_failure
;
88 void cancel_timer(struct timer_list
*t
)
90 if (!READ_ONCE(t
->expires
))
94 WRITE_ONCE(t
->expires
, 0);
97 void set_timer_ms(struct timer_list
*t
, unsigned long timeout
)
104 timeout
= msecs_to_jiffies(timeout
);
107 * Paranoia to make sure the compiler computes the timeout before
108 * loading 'jiffies' as jiffies is volatile and may be updated in
109 * the background by a timer tick. All to reduce the complexity
110 * of the addition and reduce the risk of losing a jiffie.
114 /* Keep t->expires = 0 reserved to indicate a canceled timer. */
115 mod_timer(t
, jiffies
+ timeout
?: 1);