Lenovo ThinkPad P1

This article or section does not follow the
Laptop page guidelines
.
Reason:
Stub (Discuss in
Talk:Lenovo ThinkPad P1
)
Lenovo ThinkPad P1 was released in 2018 and has up to Intel Core i7-8850H or Xeon E-2176M 6-core processor, up to 64 GB DDR4 RAM, and up to NVIDIA Quadro P2000 graphics.
Note
The ThinkPad X1 Extreme is a consumer version of the same laptop which uses extremely similar hardware. Most of the information from
Lenovo ThinkPad X1 Extreme
should be applicable to P1 models as well.
Installation
Do not change to "Discrete Graphics" with BIOS v1.15
https://www.reddit.com/r/thinkpad/comments/a2g0k4/warning_do_not_change_from_hybrid_graphics_to/
This might potentially brick your device and require Lenovo to replace your motherboard.
Apparently verified on BIOS v1.15 and still not resolved.
You will want to use BIOS v1.18 or newer.  BIOS v1.17 (released Dec 24, 2018) originally fixed the issue for the mass majority; however, this version has been removed due to additional bricking issues that happen occasionally related to the Hybrid graphics options when changed.
Firmware update
Before installation, it is recommended that you boot into Windows 10 and use the preinstalled Lenovo Vantage software to install any necessary firmware updates, particularly
this one
.
Installation with hybrid graphics
Currently the live CD might not boot normally if your BIOS is configured to enable hybrid graphics. See
NVIDIA Optimus
for details. Two options are possible:
Disable hybrid graphics by changing your BIOS settings to "Discrete only" (Be careful, this might brick your latpop:
#Do not change to "Discrete Graphics" with BIOS v1.15
)
Alternatively, before booting into live CD, press
e
and add
modprobe.blacklist=nouveau
to your kernel parameters.
If you choose to use the second option, you might also want to include
modprobe.blacklist=nouveau
in your
/boot/loader/entries/arch.conf
.
HiDPI screen
Some configurations of ThinkPad P1 comes with a HiDPI screen. See
HiDPI#Linux console (tty)
for more details.
Graphics
There are two difficulties with configuring graphics on ThinkPad P1: there is no "integrated graphics only" option in the BIOS, and the external display ports (HDMI, etc.) are wired into the NVIDIA chip. Depending on your needs, you might choose from the following options:
Discrete only
As the P1 is an hybrid device with both an integrated and discrete video card, the NVIDIA drivers have to be setup to use Optimus in order to properly work with external outputs and the integrated laptop screen. Setup NVIDIA Optimus as instructed in
NVIDIA Optimus#Use NVIDIA graphics only
.
Note that this method will keep your NVIDIA graphics card always on, which might dramatically shorten your battery life.
Black screen after X starts with NVIDIA drivers
Even if using Optimus, the driver might anyway fail to detect the laptop screen using the auto-generated
xorg.conf
file and you might experience a black screen after X has been started. See
NVIDIA Optimus#No screens found on a laptop/NVIDIA Optimus
for more details.
If you are able to connect an external monitor and verify it works, you can inspect the
xrandr -q
output to verify only HDMI and Display Port outputs are actually detected. The
tool should as well display only external video output connections.
In order to instruct the driver about the integrated laptop screen, the
xorg.conf
file has to be modified to add a
"ConnectedMonitor" Option
to the
Section "Device"
(see
NVIDIA/Troubleshooting#Screen(s) found, but none have a usable configuration
)
Use the following as
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
After re-starting X, the integrated screen output
should show be now detected and properly usable.
If the laptop screen gets detected but
xrandr
fails to properly detect the available resolutions, remove the
HorizSync
and
Vertrefresh
options from
Section "Monitor"
and restart X
Hybrid graphics with Reverse PRIME
Set up
Reverse PRIME
to do the main rendering on the Intel chip, while still being able to use the external display outputs wired to the NVIDIA chip. Battery life should remain decent with this option.
Hybrid graphics with Bumblebee
See
Bumblebee
for detailed instructions. If Xorg refuses to start after setting up Bumblebee, try generating an Xorg configuration by running
Xorg -configure
and copy it to
/etc/X11/xorg.conf
.
Because Bumblebee normally disables the NVIDIA card, display outputs such as HDMI might not show up in
xrandr -q
. You may want to refer to
Bumblebee's multi-monitor setup page
.
Hybrid graphics with bbswitch only
This method requires manual switching between integrated and discrete graphics mode. Switching between them requires restarting all Xorg instances, although it does not require a restart.
Install the appropriate
NVIDIA
graphics drivers and
bbswitch
. Generate an Xorg configuration by running
Xorg -configure
and copy it to
/etc/X11/xorg.conf.intel
. You may also create
/etc/X11/xorg.conf.nvidia
, though it should not be necessary.
After loading the module with
# modprobe bbswitch
you can switch to discrete graphics with the following Bash function:
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
}
After this,
xrandr -q
should correctly show
HDMI-0
as one of the outputs. Running
xrandr --auto
will mirror the display on an external monitor. If you want to extend your display with a different DPI, adapt the following command to your needs:
$ xrandr --output HDMI-0 --scale 2x2 --right-of eDP-1-1
Conversely, you can switch to integrated graphics this way:
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
}
You need to manually start your X session after switching.
If you are also running
TLP
, to prevent TLP from blocking system startup or shutdown, you should tell it to leave NVIDIA card alone by uncommenting the following line:
/etc/default/tlp
RUNTIME_PM_DRIVER_DENYLIST="amdgpu nouveau nvidia radeon"
You may also want to refer to
nvidia-xrun
, which allows for running a separate X session with NVIDIA graphics.
Troubleshooting
xbacklight not adjusting screen brightness
Installing
light
AUR
should help.
System hangs on startup/shutdown
If you are using hybrid graphics, ensure that your TLP is correctly blacklisting NVIDIA drivers by uncommenting this line:
/etc/default/tlp
RUNTIME_PM_DRIVER_DENYLIST="amdgpu nouveau nvidia radeon"
Also make sure that the NVIDIA card is turned on before shutdown by running:
# modprobe nvidia
You can install systemd services to manage this automatically as as follows:
/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
And a service to disable the card again at resume if it was originally off:
/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