联想 ThinkPad X1 Extreme

出自 ArchWiki

本文或本章节不符合笔记本电脑页面指南

理由:硬件表格需要 ID,并且应该添加功能键章节(在 Talk:Lenovo ThinkPad X1 Extreme 中讨论)
硬件 PCI/USB ID 工作?
触摸板
键盘
GPU (Intel)
GPU (Nvidia)
网络摄像头
以太网
蓝牙
读卡器
音频
无线
Thunderbolt
指纹识别器 06cb:009a 实验性
注意:联想 ThinkPad P1 是同款笔记本电脑的工作站版本,它使用了极其相似的硬件。本页面的大部分信息也应适用于 P1 型号。

固件更新

强烈建议更新 UEFI 固件以正常使用此笔记本电脑 - 初始 1.13 版本设备似乎存在多个可能导致笔记本电脑变砖的错误:Reddit 讨论该问题的帖子另一个 Reddit 帖子讨论不同的变砖问题

固件更新可通过 fwupd、Windows 上的 Lenovo Vantage 应用程序或联想网站获取。

强烈建议使用最新版本 v1.35。本页面的所有信息均基于最新固件。

视频

使用 USB-C 适配器或 Thunderbolt 扩展坞时创建的 HDMI 端口和 DisplayPort 输出都连接到 Nvidia 独立显卡。

可以使用 BIOS 设置禁用集成显卡,并在专用 Nvidia 显卡上运行所有内容。专用 GPU 无法通过固件禁用,因此在使用集成显卡时,强烈建议启用某种形式的运行时电源管理。

CPU 散热限制

此笔记本电脑在使用 Linux 时会受到 CPU 散热限制错误的影响。

基本上,该笔记本电脑的固件使用了 Intel 的动态平台和散热框架 (DPTF) 的一个实现,该实现在 Linux 下无法正常工作。虽然较新一代的 ThinkPad 已经获得了 BIOS 更新来修复此问题,但一位 联想员工确认,较旧的受影响的 ThinkPad(包括 T580、T480、T480s、X1C6、P1G1 和 X1E1)将不会获得此修复。

使用 s-tui 进行的压力测试表明,启动时 CPU 被限制为 38W/80C,导致 i7-8750H 上的持续全核频率约为 2850 MHz。

使用逆向工程 DPTF 实现修复

目前正在进行一项在 Linux 上逆向工程 DPTF 的 工作。结果可以在 这里找到。大部分工作已经向上游提交,但实现仍然远未完成。

从内核 5.12 开始,可以通过安装并启用 thermald 来利用正在进行的工作,thermald 将尝试利用固件的自适应性能策略。

不幸的是,当前的实现似乎对这款笔记本电脑没有太大帮助。虽然 CPU 的限制提高到 45W/83C,但全核频率不稳定,仅带来边际性能提升。

使用 dptfxtract 和手动 DPTF 配置文件设置修复

另一种选择,确实可以实现完整性能,是提取 DPTF 表并将它们与手动更改 DPTF 配置文件结合使用。

配置 thermald 以使用提取的 dptf 表

首先,确保已安装 thermald。接下来,使用 Intel 的专有 dptfxtract-binAUR 工具提取 DPTF 表

# dptfxtract

这将在 /etc/thermald/ 中填充多个 thermal-conf.xml.* 形式的配置文件,每个文件代表一个转换后的 DPTF 表。

该工具还在当前工作目录中创建每个文件的副本,因此您可能需要删除这些副本

# rm thermal-conf.xml.*

Arch Linux 附带的 thermald 服务文件默认启用自适应模式。为了使用提取的表,我们必须覆盖它。

如果必要的目录尚不存在,请创建它

# mkdir -p /etc/systemd/system/thermald.service.d

然后创建以下文件

/etc/systemd/system/thermald.service.d/override.conf
[Service]
ExecStart=
ExecStart=/usr/bin/thermald --systemd --dbus-enable

之后,重新加载 systemd 管理器配置并启用 thermald。

选择合适的配置

警告:不建议编辑 /etc/thermald/ 中的配置文件,因为它可能导致您的笔记本电脑超出规格运行!

在所有生成的配置文件中,thermald 默认将使用 thermal-conf.xml.auto。您可以通过将 --config-file 标志添加到之前创建的 override.conf 来尝试任何其他配置。

默认配置文件已经解锁了完整性能。压力测试表明,现在 CPU 被限制为 45W/95C,导致 i7-8750H 上的持续全核频率约为 3300 MHz。

手动设置 DPTF 配置文件以防止临时重新限制

上面的设置并不完美,每次 CPU 温度超过 80°C 时,笔记本电脑的嵌入式控制器 (EC) 都会重新限制 CPU 几秒钟。

可以通过手动设置自适应性能 DPTF 配置文件来解决此问题,而无需“与 EC 对抗”,使用以下脚本

set_dptf_adaptive.sh
#!/bin/bash
# Script that enables the adaptive performance DPTF profile, if available.

# Check for super user privileges.
if (( $EUID != 0 )); then
    echo "ERROR: script requires super user privileges. Exiting!"
    exit 1
fi

# from: https://github.com/torvalds/linux/blob/master/drivers/thermal/intel/int340x_thermal/int3400_thermal.c
adaptive_performance_uuid='63BE270F-1C11-48FD-A6F7-3AF253FF3E2D'

# Check if the adaptive performance profile is supported.
available_uuids=$(cat /sys/devices/platform/INT3400:00/uuids/available_uuids)

if [[ $available_uuids != *$adaptive_performance_uuid* ]]; then
  echo "ERROR: adaptive performance profile not supported. Exiting!"
  exit 1
fi

# Find the INT3400 Thermal driver.
INT3400=$(grep INT3400 /sys/class/thermal/thermal_zone*/type |
          grep Thermal |
          sed '/\/sys\/class\/thermal\/thermal_zone/ s/\/type.*//')

if [[ "$INT3400" == '' ]]; then
  echo "ERROR: unable to find the INT3400 thermal driver. Exiting!"
  exit 1
fi

# Temporarily disable the INT3400 thermal driver.
echo 'disabled' > "$INT3400"/mode

if [[ $(cat "$INT3400"/mode) != 'disabled' ]]; then
  echo "ERROR: unable to disable the INT3400 thermal driver. Exiting!"
  exit 1
fi

# Enable the adaptive performance profile.
echo "$adaptive_performance_uuid" > /sys/devices/platform/INT3400:00/uuids/current_uuid

current_uuid=$(cat /sys/devices/platform/INT3400:00/uuids/current_uuid)
if [[ "$current_uuid" != "$adaptive_performance_uuid" ]]; then
  echo "ERROR: unable to set the adaptive performance profile. Exiting!"
  exit 1
fi

# Re-enable the INT3400 thermal driver.
echo 'enabled' > "$INT3400"/mode

if [[ $(cat "$INT3400"/mode) != 'enabled' ]]; then
  echo "ERROR: unable to re-enable the INT3400 thermal driver. Exiting!"
  exit 1
fi

echo "Successfully set the adaptive performance DPTF profile."

将脚本保存到某个位置并为其创建一个 systemd 服务

/etc/systemd/system/dptf_adaptive.service
[Unit]
Description=Set Intel DPTF policy to adaptive performance

[Service]
Type=oneshot
ExecStart=/path/to/script/set_dptf_adaptive.sh

[Install]
WantedBy=default.target

不要忘记在服务文件中替换 /path/to/script/

最后,重新加载 systemd 管理器配置并启用该服务。

禁用 BDPROCHOT 以防止电池供电时限制

警告
  • 应用此修复程序后,当在膝上或类似位置使用笔记本电脑时,笔记本电脑可能会运行得比舒适温度更高。
  • 禁用 BDPROCHOT 可以被认为是电源管理方面的“核选项”。使用风险自负!
注意:写入 MSR 需要在 BIOS 中禁用安全启动。

当使用 Linux 时,笔记本电脑在电池供电时的性能远低于预期。原因似乎是被称为“膝上模式”的东西(联想 在此处记录)。

基本上,当拔下电源时,笔记本电脑默认会假定它正在用户的膝盖上使用。由于 Linux 没有可用的 DPTF 实现来告知笔记本电脑情况并非如此,因此它将始终假定它正在用户的膝盖上使用。因此,为了将笔记本电脑底座保持在“皮肤友好”的温度下,当众多热传感器之一超出预定值时,笔记本电脑的 EC 会使用 BDPROCHOT(双向处理器过热)限制 CPU。实际上,这将使 CPU 保持在最高 70°C 左右,同时阻止风扇正确启动。重复的开启-关闭全核压力测试会导致 CPU 降频至低至 800 MHz。

由于目前没有已知的方法禁用“膝上模式”,因此在电池供电时获得完整性能的唯一途径是完全禁用 BDPROCHOT。这可以使用以下脚本完成

bdprochot_disable.sh
#!/bin/bash
# Script that unsets the BDPROCHOT-bit on some Intel CPUs.

# Check for super user privileges.
if (( $EUID != 0 )); then
    echo "ERROR: script requires super user privileges. Exiting!"
    exit 1
fi

# Enable writing to model-specific registers of the CPU.
modprobe msr

# Get current state of the CPU power-related bits (in base-10).
flags=$(rdmsr 0x1FC -d)

# Check if BDPROCHOT-bit is already unset.
if [[ $(("$flags" & 0x00000001)) == 0 ]]; then
    echo "INFO: BDPROCHOT-bit is already unset. Exiting!"
    exit 0
fi

# Unset BRPROCHOT-bit.
wrmsr -a 0x1FC $(("$flags" & 0xfffffffe))

# Check if we were successful.
flags=$(rdmsr 0x1FC -d)

if [[ $(("$flags" & 0x00000001)) == 1 ]]; then
    echo "ERROR: unable to unset BDPROCHOT-bit. Exiting!"
    exit 1
fi

echo "Successfully disabled BDPROCHOT."

将脚本保存到某个位置并为其创建一个 systemd 服务

/etc/systemd/system/bdprochot_disable.service
[Unit]
Description=Disable BDPROCHOT

[Service]
Type=oneshot
ExecStart=/path/to/script/bdprochot_disable.sh

[Install]
WantedBy=default.target

挂起/恢复周期将导致 EC 重新设置 BDPROCHOT 位。

创建以下文件(并使其可执行)以在恢复时运行脚本

/lib/systemd/system-sleep/bdprochot
#!/bin/sh

case "$1" in
    post)
        /path/to/script/bdprochot_disable.sh
        ;;
esac

不要忘记在两个文件中都替换 /path/to/script/

最后,重新加载 systemd 管理器配置,启用服务并重新启动。

现在,电池供电时 CPU 的性能应该与插电时大致相同。

麦克风降噪

PulseAudio 的 PulseAudio#麦克风回声/噪音消除功能可用于减少麦克风噪音量,方法是将以下内容添加到 /etc/pulse/default.pa

/etc/pulse/default.pa
### Enable Echo/Noise-Cancellation
load-module module-echo-cancel use_master_format=1 aec_method=webrtc aec_args="beamforming=1 mic_geometry=-0.0257,0,0,0.0257,0,0" source_name=echoCancel_source sink_name=echoCancel_sink
set-default-source echoCancel_source
set-default-sink echoCancel_sink

上面的 mic_geometry 专用于 X1 Extreme。

module-filter-heuristicsmodule-filter-apply 模块有时可能会导致添加额外的噪音,因此应注释掉启用它们的行

/etc/pulse/default.pa
#load-module module-filter-heuristics
#load-module module-filter-apply

糟糕的音质也可能由音频削波引起,如果 alsamixer 中“Internal Mic Boost”大于零,则可能会发生这种情况。

指纹识别器

一项逆向工程工作正在 此处进行,并且 AUR 上提供了实验性驱动程序 python-validityAUR

上游 libfprint 错误在 此处跟踪。

参见