mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-24 00:22:07 +07:00
17f5d57915
The X1 Extreme is one of the systems that lies about which backlight interface that it uses in its VBIOS as PWM backlight controls don't work at all on this machine. It's possible that this panel could be one of the infamous ones that can switch between PWM mode and DPCD backlight control mode, but we haven't gotten any more details on this from Lenovo just yet. For the time being though, making sure the backlight 'just works' is a bit more important. So, add a quirk to force DPCD backlight controls on for these systems based on EDID (since this panel doesn't appear to fill in the device ID). Hopefully in the future we'll figure out a better way of probing this. Changes since v2: * The bugzilla URL is deprecated, bug reporting happens on gitlab now. Update the messages we print to reflect this * Also, take the opportunity to move FDO_BUG_URL out of i915_utils.c and into i915_utils.h so that other places which print things that aren't traditional errors but are worth filing bugs about, can actually use it. Signed-off-by: Lyude Paul <lyude@redhat.com> Reviewed-by: Adam Jackson <ajax@redhat.com> Cc: Jani Nikula <jani.nikula@intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20200303215320.93491-1-lyude@redhat.com
106 lines
2.4 KiB
C
106 lines
2.4 KiB
C
// 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;
|
|
}
|
|
}
|
|
|
|
#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(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();
|
|
|
|
mod_timer(t, jiffies + timeout);
|
|
}
|