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