MECHREVO WUJIE16 Pro无法休眠和无法识别HDMI口的解决方法

机械革命 无界16 Pro在 Linux 无法S3休眠和无法识别HDMI口问题的解决方法。

问题描述

S3 休眠后无法唤醒:唤醒时屏幕背光亮(每隔几秒亮一次)但屏幕不亮,CPU风扇高速运行。

HDMI口无法识别:自带的HDMI口无输出,在xrandr中无法看到HDMI-1

问题原因

因为 VBT (Video BIOS Tables) 提供了错误的信息,导致i915驱动程序无法正确初始化,从而导致上述问题。

解决方法

最根本的解决方法是修复VBT中的错误信息,但这可能不太现实。

但我们可以通过修改i915驱动程序来解决此问题。

一下内容以Linux Kernel 6.0为例

  1. 按照如下所示修改drivers/gpu/drm/i915/display/intel_bios.c中的parse_ddi_port函数:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    --- a/drivers/gpu/drm/i915/display/intel_bios.c
    +++ b/drivers/gpu/drm/i915/display/intel_bios.c
    @@ -2671,10 +2671,15 @@ static void parse_ddi_port(struct intel_bios_encoder_data *devdata)
    }

    if (i915->vbt.ports[port]) {
    + // drm_dbg_kms(&i915->drm,
    + // "More than one child device for port %c in VBT, using the first.\n",
    + // port_name(port));
    + // return;
    drm_dbg_kms(&i915->drm,
    - "More than one child device for port %c in VBT, using the first.\n",
    - port_name(port));
    - return;
    + "i915 stucks with an nonexisting eDP, "
    + "thus although we have more than one child device for port %c in VBT, "
    + "using the latter one and ignore the first.\n",
    + port_name(port));
    }

    sanitize_device_type(devdata, port);
    其实上述修改就是去掉这一个return
  2. 重新编译内核并安装

这一个问题也值得注意,可以顺带一起修复。

参考

https://gitlab.freedesktop.org/drm/intel/-/issues/5531
https://gitlab.freedesktop.org/drm/intel/-/issues/6743