Lenovo ThinkPad P1

来自 ArchWiki

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

原因: 小作品 (在Talk:Lenovo ThinkPad P1中讨论)

Lenovo ThinkPad P1 于 2018 年发布,最高配备 Intel Core i7-8850H 或 Xeon E-2176M 6 核处理器,最高 64 GB DDR4 RAM,以及最高 NVIDIA Quadro P2000 显卡。

注意: ThinkPad X1 Extreme 是同一款笔记本电脑的消费级版本,它使用了极其相似的硬件。Lenovo ThinkPad X1 Extreme 中的大多数信息也应适用于 P1 型号。

安装

BIOS v1.15 版本请勿更改为“独立显卡”

https://www.reddit.com/r/thinkpad/comments/a2g0k4/warning_do_not_change_from_hybrid_graphics_to/

这可能会导致您的设备变砖,并需要联想更换您的主板。显然已在 BIOS v1.15 上验证,但仍未解决。

您需要使用 BIOS v1.18 或更高版本。BIOS v1.17(于 2018 年 12 月 24 日发布)最初修复了绝大多数问题;但是,此版本已被删除,原因是与更改混合显卡选项时偶尔发生的其他变砖问题有关。

固件更新

在安装之前,建议您启动进入 Windows 10 并使用预装的 Lenovo Vantage 软件安装任何必要的固件更新,特别是这个

混合显卡安装

目前,如果您的 BIOS 配置为启用混合显卡,则 Live CD 可能无法正常启动。有关详细信息,请参阅NVIDIA Optimus。有两种可能的选择

  • 禁用混合显卡,方法是将您的 BIOS 设置更改为“仅独立显卡”(注意:这可能会导致您的笔记本电脑变砖:#BIOS v1.15 版本请勿更改为“独立显卡”
  • 或者,在启动进入 Live CD 之前,按 e 并将 modprobe.blacklist=nouveau 添加到您的内核参数。

如果您选择使用第二种选择,您可能还想在您的 /boot/loader/entries/arch.conf 中包含 modprobe.blacklist=nouveau

HiDPI 屏幕

某些 ThinkPad P1 配置配备了 HiDPI 屏幕。有关更多详细信息,请参阅HiDPI#Linux 控制台 (tty)

显卡

在 ThinkPad P1 上配置显卡有两个难点:BIOS 中没有“仅集成显卡”选项,并且外部显示端口(HDMI 等)连接到 NVIDIA 芯片。根据您的需求,您可以从以下选项中选择

仅独立显卡

由于 P1 是一款混合设备,同时具有集成显卡和独立显卡,因此必须设置 NVIDIA 驱动程序以使用 Optimus,以便与外部输出和集成笔记本电脑屏幕正常工作。按照NVIDIA Optimus#仅使用 NVIDIA 显卡中的说明设置 NVIDIA Optimus。请注意,此方法将使您的 NVIDIA 显卡始终处于开启状态,这可能会大大缩短您的电池续航时间。

使用 NVIDIA 驱动启动 X 后黑屏

即使使用 Optimus,驱动程序可能仍然无法使用自动生成的 xorg.conf 文件检测到笔记本电脑屏幕,并且您可能会在启动 X 后遇到黑屏。有关更多详细信息,请参阅NVIDIA Optimus#在笔记本电脑上找不到屏幕/NVIDIA Optimus

如果您能够连接外部显示器并验证其工作正常,您可以检查 xrandr -q 输出以验证是否仅检测到 HDMI 和 Display Port 输出。 工具也应仅显示外部视频输出连接。

为了向驱动程序指示集成笔记本电脑屏幕,必须修改 xorg.conf 文件,以将 "ConnectedMonitor" Option 添加到 Section "Device"(请参阅NVIDIA/Troubleshooting#已找到屏幕,但没有可用的配置

使用以下内容作为 xorg.conf Section "Device"

  Section "Device"
      Identifier      "nvidia"
      Driver         "nvidia"
      VendorName     "NVIDIA Corporation"
      BusId          "1:0:0"
      Option         "AllowEmptyInitialConfiguration"
      Option	      "ConnectedMonitor" "eDP"
      Option	      "CustomEDID" "eDP:/sys/class/drm/card0-eDP-1/edid"
      Option	      "IgnoreEDID" "false"
      Option	      "UseEDID" "true" 
  EndSection

重新启动 X 后,集成屏幕输出 现在应该显示已检测到并可以正常使用。

如果笔记本电脑屏幕被检测到,但 xrandr 无法正确检测到可用的分辨率,请从 Section "Monitor" 中删除 HorizSyncVertrefresh 选项,然后重新启动 X

使用 Reverse PRIME 的混合显卡

设置Reverse PRIME 以在 Intel 芯片上进行主渲染,同时仍然能够使用连接到 NVIDIA 芯片的外部显示输出。使用此选项,电池续航时间应保持良好。

使用 Bumblebee 的混合显卡

有关详细说明,请参阅Bumblebee。如果在设置 Bumblebee 后 Xorg 拒绝启动,请尝试通过运行 Xorg -configure 生成 Xorg 配置文件,并将其复制到 /etc/X11/xorg.conf

由于 Bumblebee 通常会禁用 NVIDIA 显卡,因此 HDMI 等显示输出可能不会在 xrandr -q 中显示。您可能需要参考Bumblebee 的多显示器设置页面

仅使用 bbswitch 的混合显卡

此方法需要手动在集成显卡和独立显卡模式之间切换。在它们之间切换需要重新启动所有 Xorg 实例,尽管它不需要重新启动。

安装适当的NVIDIA 显卡驱动程序和 bbswitch。通过运行 Xorg -configure 生成 Xorg 配置文件,并将其复制到 /etc/X11/xorg.conf.intel。您也可以创建 /etc/X11/xorg.conf.nvidia,尽管这不是必需的。

加载模块后,使用

# modprobe bbswitch

您可以使用以下 Bash 函数切换到独立显卡

discrete() {
    killall Xorg
    modprobe nvidia_drm
    modprobe nvidia_modeset
    modprobe nvidia
    tee /proc/acpi/bbswitch <<<ON
    cp /etc/X11/xorg.conf.nvidia /etc/X11/xorg.conf
}

此后,xrandr -q 应正确显示 HDMI-0 作为输出之一。运行 xrandr --auto 会将显示镜像到外部显示器。如果您想使用不同的 DPI 扩展您的显示,请根据您的需要调整以下命令

$ xrandr --output HDMI-0 --scale 2x2 --right-of eDP-1-1

相反,您可以使用这种方式切换到集成显卡

integrated() {
    killall Xorg
    rmmod nvidia_drm
    rmmod nvidia_modeset
    rmmod nvidia
    tee /proc/acpi/bbswitch <<<OFF
    cp /etc/X11/xorg.conf.intel /etc/X11/xorg.conf
}

切换后,您需要手动启动您的 X 会话。

如果您还运行 TLP,为了防止 TLP 阻止系统启动或关机,您应该告诉它不要管 NVIDIA 显卡,方法是取消注释以下行

/etc/default/tlp
RUNTIME_PM_DRIVER_DENYLIST="amdgpu nouveau nvidia radeon"

您可能还需要参考 nvidia-xrun,它允许使用 NVIDIA 显卡运行单独的 X 会话。

故障排除

xbacklight 无法调节屏幕亮度

安装 lightAUR 应该会有所帮助。

系统启动/关机时卡住

如果您正在使用混合显卡,请确保您的 TLP 正确地将 NVIDIA 驱动程序列入黑名单,方法是取消注释此行

/etc/default/tlp
RUNTIME_PM_DRIVER_DENYLIST="amdgpu nouveau nvidia radeon"

还要确保在关机前通过运行以下命令打开 NVIDIA 显卡

# modprobe nvidia

您可以安装 systemd 服务来自动管理此操作,如下所示

/etc/systemd/system/nvidia-enable-power-off.service
[Unit]
Description=Enable NVIDIA card at shutdown
DefaultDependencies=no

[Service]
Type=oneshot
ExecStart=/bin/sh -c "awk '{print $2}' /proc/acpi/bbswitch > /tmp/gpu_state && echo ON > /proc/acpi/bbswitch"
#ExecStart=/usr/bin/modprobe nvidia

[Install]
WantedBy=shutdown.target
WantedBy=reboot.target
WantedBy=hibernate.target
WantedBy=suspend-then-hibernate.target
WantedBy=sleep.target
WantedBy=suspend.target

以及在恢复时再次禁用显卡的服务(如果它最初处于关闭状态)

/etc/systemd/system/nvidia-disable-resume.service
[Unit]
Description=Disable NVIDIA card at system resume
DefaultDependencies=no
After=sleep.target
After=suspend.target
After=suspend-then-hibernate.target
After=hibernate.target

[Service]
Type=oneshot
ExecStart=/bin/sh -c 'cat /tmp/gpu_state > /proc/acpi/bbswitch || echo OFF > /proc/acpi/bbswitch'
#ExecStart=/usr/bin/rmmod nvidia

[Install]
#WantedBy=shutdown.target
#WantedBy=reboot.target
WantedBy=sleep.target
WantedBy=suspend.target
WantedBy=suspend-then-hibernate.target
WantedBy=hibernate.target