Loading...
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 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 | // SPDX-License-Identifier: MIT /* * Copyright © 2019 Intel Corporation */ #include <linux/device.h> #include <drm/drm_drv.h> #include "i915_drv.h" #include "i915_reg.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 (!timer_active(t)) 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); } bool i915_vtd_active(struct drm_i915_private *i915) { if (device_iommu_mapped(i915->drm.dev)) return true; /* Running as a guest, we assume the host is enforcing VT'd */ return i915_run_as_guest(); } bool i915_direct_stolen_access(struct drm_i915_private *i915) { /* * Wa_22018444074 * * Access via BAR can hang MTL, go directly to GSM/DSM, * except for VM guests which won't have access to it. * * Normally this would not work but on MTL the system firmware * should have relaxed the access permissions sufficiently. * 0x138914==0x1 indicates that the firmware has done its job. */ return IS_METEORLAKE(i915) && !i915_run_as_guest() && intel_uncore_read(&i915->uncore, MTL_PCODE_STOLEN_ACCESS) == STOLEN_ACCESS_ALLOWED; } |