Branch data Line data Source code
1 : : // SPDX-License-Identifier: MIT 2 : : /* 3 : : * Copyright © 2019 Intel Corporation 4 : : */ 5 : : 6 : : #include <drm/drm_drv.h> 7 : : 8 : : #include "i915_drv.h" 9 : : #include "i915_utils.h" 10 : : 11 : : #define FDO_BUG_URL "https://gitlab.freedesktop.org/drm/intel/-/wikis/How-to-file-i915-bugs" 12 : : #define FDO_BUG_MSG "Please file a bug on drm/i915; see " FDO_BUG_URL " for details." 13 : : 14 : : void 15 : 0 : __i915_printk(struct drm_i915_private *dev_priv, const char *level, 16 : : const char *fmt, ...) 17 : : { 18 : 0 : static bool shown_bug_once; 19 : 0 : struct device *kdev = dev_priv->drm.dev; 20 : 0 : bool is_error = level[1] <= KERN_ERR[1]; 21 : 0 : bool is_debug = level[1] == KERN_DEBUG[1]; 22 : 0 : struct va_format vaf; 23 : 0 : va_list args; 24 : : 25 [ # # # # ]: 0 : if (is_debug && !drm_debug_enabled(DRM_UT_DRIVER)) 26 : 0 : return; 27 : : 28 : 0 : va_start(args, fmt); 29 : : 30 : 0 : vaf.fmt = fmt; 31 : 0 : vaf.va = &args; 32 : : 33 [ # # ]: 0 : if (is_error) 34 : 0 : dev_printk(level, kdev, "%pV", &vaf); 35 : : else 36 : 0 : dev_printk(level, kdev, "[" DRM_NAME ":%ps] %pV", 37 : : __builtin_return_address(0), &vaf); 38 : : 39 : 0 : va_end(args); 40 : : 41 [ # # # # ]: 0 : if (is_error && !shown_bug_once) { 42 : : /* 43 : : * Ask the user to file a bug report for the error, except 44 : : * if they may have caused the bug by fiddling with unsafe 45 : : * module parameters. 46 : : */ 47 [ # # ]: 0 : if (!test_taint(TAINT_USER)) 48 : 0 : dev_notice(kdev, "%s", FDO_BUG_MSG); 49 : 0 : shown_bug_once = true; 50 : : } 51 : : } 52 : : 53 : : #if IS_ENABLED(CONFIG_DRM_I915_DEBUG) 54 : : static unsigned int i915_probe_fail_count; 55 : : 56 : : int __i915_inject_probe_error(struct drm_i915_private *i915, int err, 57 : : const char *func, int line) 58 : : { 59 : : if (i915_probe_fail_count >= i915_modparams.inject_probe_failure) 60 : : return 0; 61 : : 62 : : if (++i915_probe_fail_count < i915_modparams.inject_probe_failure) 63 : : return 0; 64 : : 65 : : __i915_printk(i915, KERN_INFO, 66 : : "Injecting failure %d at checkpoint %u [%s:%d]\n", 67 : : err, i915_modparams.inject_probe_failure, func, line); 68 : : i915_modparams.inject_probe_failure = 0; 69 : : return err; 70 : : } 71 : : 72 : : bool i915_error_injected(void) 73 : : { 74 : : return i915_probe_fail_count && !i915_modparams.inject_probe_failure; 75 : : } 76 : : 77 : : #endif 78 : : 79 : 0 : void cancel_timer(struct timer_list *t) 80 : : { 81 [ # # ]: 0 : if (!READ_ONCE(t->expires)) 82 : : return; 83 : : 84 : 0 : del_timer(t); 85 : 0 : WRITE_ONCE(t->expires, 0); 86 : : } 87 : : 88 : 0 : void set_timer_ms(struct timer_list *t, unsigned long timeout) 89 : : { 90 [ # # ]: 0 : if (!timeout) { 91 [ # # ]: 0 : cancel_timer(t); 92 : 0 : return; 93 : : } 94 : : 95 [ # # ]: 0 : timeout = msecs_to_jiffies_timeout(timeout); 96 : : 97 : : /* 98 : : * Paranoia to make sure the compiler computes the timeout before 99 : : * loading 'jiffies' as jiffies is volatile and may be updated in 100 : : * the background by a timer tick. All to reduce the complexity 101 : : * of the addition and reduce the risk of losing a jiffie. 102 : : */ 103 : 0 : barrier(); 104 : : 105 : 0 : mod_timer(t, jiffies + timeout); 106 : : }