8086:5916 will not honor i915.fastboot on kernel 5.7.0 or higher
Introduced by commit 0F8839F5, a forced call to intel_modeset_calc_cdclk()
will discard the initial CDCLK for a lower, more sensible value at the cost, however, of requiring a modeset at boot time; whilst I understand that this behaviour may indeed be required due to [unnecessarily high] manufacturer settings, no warning regarding its impact on i915.fastboot
is emitted, silently affecting the otherwise flicker-free boot experience. No additional steps are required to replicate the issue given that i915.fastboot
is enabled by default on KBL.
The expected behaviour, I believe, would be either having drm/i915 keep the pre-os CDCLK as it did up to kernel 5.6.19, or alternatively emitting a warning, at least when i915.fastboot=1
is explicitly set, informing the user that a modeset is nonetheless required due to a logical recomputation of the core display clock.
It is worth mentioning that, at the time of this writing, drm-tip still forces a modeset on the system.
System Information
- Intel Corporation HD Graphics 620 [8086:5916] (rev 02)
- Display: eDP1 connected primary 1366x768+0+0
- Product: DELL Inspiron 14-3467 (BIOS 2.13.0)
- Intel(R) Core(TM) i3-7130U CPU @ 2.70GHz
- kernel-5.10.8-100.fc32.x86_64
should it prove of any interest, I have attached the workaround I use on 5.10.8-100.fc32 to effectively honor i915.fastboot
:
@@ -12242 +12242 @@ int intel_dotclock_calculate(int link_freq,
- return div_u64(mul_u32_u32(m_n->link_m, link_freq), m_n->link_n);
+ return DIV64_U64_ROUND_CLOSEST(mul_u32_u32(m_n->link_m, link_freq), m_n->link_n);
@@ -15020 +15020 @@ static int intel_atomic_check(struct drm_device *dev,
- if (dev_priv->wm.distrust_bios_wm)
+ if (dev_priv->wm.distrust_bios_wm && !fastboot_enabled(dev_priv))
The patch @ intel_display.c takes into account i915.fastboot
while also avoiding a gratuituous modeset caused by:
[PLANE:31:plane 1A] min cdclk (73810 kHz) > [CRTC:51:pipe A] min cdclk (73809 kHz)
which may ultimately stem from lost precision at intel_dotclock_calculate()
, where:
-
m_n->link_m ← 143324
(reported byintel_cpu_transcoder_get_m_n()
) -
m_n->link_n ← 524288
(reported byintel_cpu_transcoder_get_m_n()
) -
link_freq ← 270000
(reported byconst skl_ddi_lcpll_get_freq()
)
results in a truncated value of 73809.58, instead of 73810.
kmsg_drm_debug-2021012000.asc lspci-2021012000.asc 8192-drm-i915-restore-flicker-free-boot.patch