Hatred's Log Place

DON'T PANIC!

Mar 14, 2023 - 7 minute read - Linux Thinkpad

Thinkpad P15 Gen2: гибридная графика

Карта у меня стоит далеко не топовая:

nVidia T1200
$ lspci -nn | grep VGA
00:02.0 VGA compatible controller [0300]: Intel Corporation TigerLake-H GT1 [UHD Graphics] [8086:9a60] (rev 01)
01:00.0 VGA compatible controller [0300]: NVIDIA Corporation TU117GLM [T1200 Laptop GPU] [10de:1fbc] (rev a1)

Карта поколения NV160 family (Turing). Это будет важно в дальнейшем.

Первое, у нас, аналогично T530 (там правда mDP, а VGA - на встроенную карту, но тут VGA нет /дополнительный порт - через TypeC/), HDMI разведён на дискретную карту. Соответственно нельзя использовать её без настройки оной.

Второе, эта карта поддерживается открытым ядерными драйверами от самой nvidia: nvidia-open / nvidia-open-dkms. К сожалению, самих драйверов не завезли в репозитории Manjaro (тогда как в ArchLinux они есть). Ставим beta или git из AUR.

Внешний монитор на HDMI

Главное - удалить пакет bumblebee: он блеклистит как драйвера нуво (nouveau), так и официальный драйвера nVidia.

При этом, при загруженной системе выход на HDMI работает как с открытыми драйверами nouveau из коробки, так и с закрытыми драйверами.

Для нуво ничего, собственно, делать не нужно, единственно, стоит удалить xf86-video-nouveau, так для карт поколения NVC50+ рекомендую использовать встроенный modeset.

Для проприетарных - ниже.

Для того, что бы средствами обычного xrandr/DRM внешний порт нормально цеплялся:

  1. Удалить bumblebee
  2. Добавить в загрузку nvidia_drm (не обязательно, при удалённом bumblebee он и сам загрузится)
  3. Добавить параметр nvidia_drm.modeset=1 (я сделал через параметры модулей)

Для загрузки модуля, пишем в /etc/modules-load.d/modules.conf:

# List of modules to load at boot  
nvidia_drm

TBD:

  • nvidia
  • nvidia_drm
  • nvidia_uvm
  • nvidia_modeset

Для параметров, создаём файл /etc/modprobe.d/nvidia.conf:

options nvidia_drm modeset=1

Это автоматически подгрузит и nvidia_modeset.

Всё, после чего у нас всё магическим образом заработает:

$ xrandr --listproviders
Providers: number : 2  
Provider 0: id: 0x49 cap: 0xf, Source Output, Sink Output, Source Offload, Sink Offload crtcs: 4 outputs: 7 associated providers: 1 name:modesetting  
Provider 1: id: 0x2a2 cap: 0x2, Sink Output crtcs: 4 outputs: 5 associated providers: 1 name:NVIDIA-G0

А в KDE Plasma по Fn+F7 будет работать выбор режима расширения экрана при подключенном внешнем мониторе.

PRIME

В отличии от HDMI выхода, драйвера nouveau не работают от слова совсем. Ошибка. TBD: добавить вывод ошибки.

Поэтому рассматриваем только официальные драйвера.

Ставим:

$ sudo pacman -S nvidia-prime

Проверяем:

$ prime-run glxinfo | grep "OpenGL renderer"
OpenGL renderer string: NVIDIA T1200 Laptop GPU/PCIe/SSE2

По сути, он просто задаёт нужные переменные окружения:

Настройки для внешнего монитора должны быть сделаны.

Power Management

Как говорится тут для новейших карт Ampere ничего делать не нужно, а наша Turing мы можем полностью отключить карту, когда она не используется. Нужно создать udev правила /etc/udev/rules.d/80-nvidia-pm.rules:

# Enable runtime PM for NVIDIA VGA/3D controller devices on driver bind
ACTION=="bind", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x030000", TEST=="power/control", ATTR{power/control}="auto"
ACTION=="bind", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x030200", TEST=="power/control", ATTR{power/control}="auto"

# Disable runtime PM for NVIDIA VGA/3D controller devices on driver unbind
ACTION=="unbind", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x030000", TEST=="power/control", ATTR{power/control}="on"
ACTION=="unbind", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x030200", TEST=="power/control", ATTR{power/control}="on"

И добавить параметры для главного модуля nvidia:

options nvidia "NVreg_DynamicPowerManagement=0x02"

Затем включить сервис nvidia-persistenced.service:

sudo systemctl enable nvidia-persistenced.service

Проблемы

Зависает ядро

Точнее так, это не беда nVidia, это беда только на процессорах 11gen от Intel, который, собственно у меня и стоит:

Сама проблема описана тут:

nvidia may not boot on Linux 5.18 (or later) on systems with Intel CPUs (likely only of 11th Gen and onward) due to FS#74886/ FS#74891. Until this is fixed, a workaround is disabling the Indirect Branch Tracking CPU security feature by setting the ibt=off kernel parameter from the boot loader. This security feature is responsible for mitigating a class of exploit techniques, but is deemed safe as a temporary stopgap solution.

У меня аффектит в том числе и работу Virtual Box:

[  456.563262] SUPR0GipMap: fGetGipCpu=0x1b  
[  457.249272] traps: Missing ENDBR: 0xffffacace3a50c20  
[  457.249303] ------------[ cut here ]------------  
[  457.249304] kernel BUG at arch/x86/kernel/traps.c:255!  
[  457.249308] invalid opcode: 0000 [#1] PREEMPT SMP NOPTI  
[  457.249312] CPU: 14 PID: 6732 Comm: EMT-0 Tainted: G           OE      6.1.12-1-MANJARO #1 d419fb51ba9431ae2a4575820ea6b5b95f50a34f  
[  457.249314] Hardware name: LENOVO 20YQ0058RT/20YQ0058RT, BIOS N37ET39W (1.20 ) 04/15/2022  
[  457.249315] RIP: 0010:exc_control_protection+0xc2/0xd0  
[  457.249320] Code: fa ff 45 31 c9 49 89 d8 b9 09 00 00 00 48 8b 93 80 00 00 00 be fc 00 00 00 48 c7 c7 09 4e 44 b9 e8 c3 84 46 ff e9 64 ff ff ff <0f> 0b 66 66 2e 0f 1f 84 00 00 00 00 00 9  
0 66 0f 1f 00 55 53 48 89  
[  457.249321] RSP: 0018:ffffacace1cf7c38 EFLAGS: 00010002  
[  457.249323] RAX: 0000000000000028 RBX: ffffacace1cf7c58 RCX: 0000000000000000  
[  457.249324] RDX: 0000000000000000 RSI: ffff8afd1f7a1660 RDI: ffff8afd1f7a1660  
[  457.249325] RBP: 0000000000000003 R08: 0000000000000000 R09: ffffacace1cf7ad0  
[  457.249325] R10: 0000000000000003 R11: ffffffffb9ccc7e8 R12: 0000000000000000  
[  457.249326] R13: 0000000000000000 R14: 0000000000000000 R15: 0000000000000000  
[  457.249327] FS:  00007fe0241fd6c0(0000) GS:ffff8afd1f780000(0000) knlGS:0000000000000000  
[  457.249328] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033  
[  457.249329] CR2: ffffacace38c5b10 CR3: 00000002ac0d0006 CR4: 0000000000f70ee0  
[  457.249330] PKRU: 55555554  
[  457.249331] Call Trace:  
[  457.249333]  <TASK>  
[  457.249335]  asm_exc_control_protection+0x26/0x30  
[  457.249337] RIP: 0010:0xffffacace3a50c20  
[  457.249339] Code: 16 9d e6 ff 4c 89 e7 89 c3 e8 7c 94 e6 ff 85 db 0f 48 c3 5b 41 5c 5d c3 66 90 b8 fe ff ff ff c3 66 2e 0f 1f 84 00 00 00 00 00 <83> fe 0f 77 53 55 83 ce 10 48 89 e5 53 4  
8 89 fb 48 8d 7f 18 48 83  
[  457.249340] RSP: 0018:ffffacace1cf7d08 EFLAGS: 00010246  
[  457.249341] RAX: 0000000000000000 RBX: ffffacace2219010 RCX: 0000000000000001  
[  457.249342] RDX: 0000000000000000 RSI: 0000000000000000 RDI: ffffacace2219030  
[  457.249343] RBP: ffffacace1cf7de0 R08: ffffacace3a5b95d R09: ffffacace2219010  
[  457.249343] R10: ffffacace226a000 R11: 0000000000000000 R12: ffff8af9c6c79a10  
[  457.249344] R13: ffffffffc0bffce0 R14: 0000000000000004 R15: ffff8af9c6c79a10  
[  457.249346]  ? asm_exc_page_fault+0x26/0x30  
[  457.249348]  ? supdrvIOCtl+0x2d77/0x31b0 [vboxdrv 2ebee49653aba23a54dbd683c8be87cd93f03860]  
[  457.249364]  ? _copy_from_user+0x47/0x60  
[  457.249368]  ? VBoxDrvLinuxIOCtl_7_0_6+0x162/0x260 [vboxdrv 2ebee49653aba23a54dbd683c8be87cd93f03860]  
[  457.249376]  ? do_syscall_64+0x6b/0x90  
[  457.249378]  ? __x64_sys_ioctl+0x91/0xd0  
[  457.249381]  ? do_syscall_64+0x5c/0x90  
[  457.249382]  ? exc_page_fault+0x74/0x170  
[  457.249384]  ? entry_SYSCALL_64_after_hwframe+0x63/0xcd  
[  457.249385]  </TASK>  
[  457.249386] Modules linked in: snd_seq_dummy snd_seq snd_seq_device ccm rfcomm qrtr cmac algif_hash algif_skcipher af_alg bnep btusb uvcvideo btrtl videobuf2_vmalloc btbcm videobuf2_memo  
ps btintel videobuf2_v4l2 btmtk videobuf2_common videodev bluetooth mc ecdh_generic joydev mousedev snd_ctl_led snd_soc_skl_hda_dsp snd_soc_intel_hda_dsp_common snd_soc_hdac_hdmi snd_sof_pr  
obes snd_hda_codec_realtek snd_hda_codec_generic snd_soc_dmic snd_sof_pci_intel_tgl snd_sof_intel_hda_common soundwire_intel soundwire_generic_allocation soundwire_cadence snd_sof_intel_hda  
snd_sof_pci snd_sof_xtensa_dsp intel_tcc_cooling snd_sof snd_sof_utils x86_pkg_temp_thermal snd_soc_hdac_hda intel_powerclamp snd_hda_ext_core coretemp snd_soc_acpi_intel_match kvm_intel s  
nd_soc_acpi vfat fat soundwire_bus kvm snd_soc_core iwlmvm irqbypass crct10dif_pclmul snd_compress crc32_pclmul ac97_bus polyval_clmulni snd_hda_codec_hdmi snd_pcm_dmaengine polyval_generic  
gf128mul ghash_clmulni_intel mac80211 sha512_ssse3  
[  457.249418]  snd_hda_intel aesni_intel processor_thermal_device_pci_legacy snd_intel_dspcfg crypto_simd snd_intel_sdw_acpi processor_thermal_device cryptd libarc4 mei_hdcp mei_pxp snd_hd  
a_codec processor_thermal_rfim iTCO_wdt rapl nouveau iwlwifi snd_hda_core spi_nor intel_pmc_bxt processor_thermal_mbox snd_hwdep mei_me intel_cstate iTCO_vendor_support ee1004 intel_rapl_ms  
r ucsi_acpi processor_thermal_rapl think_lmi snd_pcm intel_uncore cfg80211 psmouse pcspkr firmware_attributes_class mtd wmi_bmof typec_ucsi i2c_i801 mxm_wmi igc mei intel_rapl_common thunde  
rbolt snd_timer drm_ttm_helper i2c_smbus typec intel_soc_dts_iosf roles int3400_thermal int3403_thermal acpi_thermal_rel int340x_thermal_zone intel_hid acpi_pad sparse_keymap acpi_tad mac_h  
id dm_multipath dm_mod vboxnetflt(OE) vboxnetadp(OE) vboxdrv(OE) sg crypto_user fuse acpi_call(OE) bpf_preload ip_tables x_tables ext4 crc32c_generic crc16 mbcache jbd2 rtsx_pci_sdmmc mmc_c  
ore nvme thinkpad_acpi nvme_core crc32c_intel spi_intel_pci  
[  457.249452]  xhci_pci serio_raw rtsx_pci ledtrig_audio spi_intel nvme_common xhci_pci_renesas atkbd platform_profile libps2 snd vivaldi_fmap soundcore i8042 rfkill serio i915 drm_buddy i  
ntel_gtt video wmi drm_display_helper cec ttm  
[  457.249462] ---[ end trace 0000000000000000 ]---  
[  457.249463] RIP: 0010:exc_control_protection+0xc2/0xd0  
[  457.249465] Code: fa ff 45 31 c9 49 89 d8 b9 09 00 00 00 48 8b 93 80 00 00 00 be fc 00 00 00 48 c7 c7 09 4e 44 b9 e8 c3 84 46 ff e9 64 ff ff ff <0f> 0b 66 66 2e 0f 1f 84 00 00 00 00 00 9  
0 66 0f 1f 00 55 53 48 89  
[  457.249466] RSP: 0018:ffffacace1cf7c38 EFLAGS: 00010002  
[  457.249467] RAX: 0000000000000028 RBX: ffffacace1cf7c58 RCX: 0000000000000000  
[  457.249468] RDX: 0000000000000000 RSI: ffff8afd1f7a1660 RDI: ffff8afd1f7a1660  
[  457.249468] RBP: 0000000000000003 R08: 0000000000000000 R09: ffffacace1cf7ad0  
[  457.249469] R10: 0000000000000003 R11: ffffffffb9ccc7e8 R12: 0000000000000000  
[  457.249469] R13: 0000000000000000 R14: 0000000000000000 R15: 0000000000000000  
[  457.249470] FS:  00007fe0241fd6c0(0000) GS:ffff8afd1f780000(0000) knlGS:0000000000000000  
[  457.249471] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033  
[  457.249472] CR2: ffffacace38c5b10 CR3: 00000002ac0d0006 CR4: 0000000000f70ee0  
[  457.249473] PKRU: 55555554

В выхлопе nVidia тоже будет присутстввать:

traps: Missing ENDBR: 0xffffacace3a50c20  

Решение: добавить параметр ibt=off для ядра.

Открываем /etc/default/grub и добавляем:

GRUB_CMDLINE_LINUX_DEFAULT="... ibt=off ...

После чего:

sudo update-grub

и перезагрузка.

Не запускается SDDM

У меня такое на дровах из репозитория. Поставил nvidia-open-beta - проблема ушла.

Особенности

Кто кого блеклистит и когда.

Первое, пакет nvidia-utils содержит в себе конфиги для modprobe (/usr/lib/modprobe.d/nvidia-utils-beta.conf), который блеклистит nouveau. Имейте ввиду.

Второе, как было сказано выше, bumblebee блеклистит походим образом как nouveau, так и официальные драйвера. Внесение в чёрный список защищает от автоматической загрузки, а принудительно загрузить всё так же можно. Чем bumblebee и пользуется для организации offloading.

Далее, данные о блеклистинге попадают в том числе в initramfs, поэтому, вцелом, на гибридной графике можно не отказываться от kms - нуво всё равно не загрузится при наличии проприетарных драйверов, только если вы сами этого явно не скажите.

Ссылки