Linux VGA Switcheroo для nVidia

ВАЖНО! Данная страница несколько устарела, вероятно, вам более пригодится вот это.

Работаем над проблемой переключения видеокарт в мобильном оборудовании.

Описание проблемы

Не так давно производители начали изобретать совершенно странной природы велосипеды, не давая при этом никаких инструкций, как на них ездить. Камнем преткновения стала технология переключаемого гибридного видео в лэптопах. Если дела с продукцией ATI обстоят более-менее сносно, то этого нельзя сказать про nVidia.

А как же BIOS

Отключение интегрированной графики Intel средствами Setup в BIOS — на сегодняшний момент единственное работающее решение, однако возможность встречается на столько редко, что повезло не многим. Количество настроек в последних BIOS-ах AMI поражает воображение в нехорошем смысле слова, редко там есть что-то кроме выбора, на каком устройстве искать загрузчик, видимо в AMI считают, что настали времена тотального Plug-n-Play-а.

Что имеем

Просто сказать, что это не работает, ничего не сказать. Сказать, что это должно работать, однако не работает, тоже ничего не сказать. По сути дела проблемы две:

  1. Собственно переключить видеокарту
  2. Переключить дисплей на видеокарту

Первая с трудом, но была решена, тогда как вторая — нет.

Официально

Официальным ответом от представителя nVidia было то, что у них нет планов по поддержки переключения видеокарт в Linux (пруфлинк).

Железо

Ноутбуки с процессорами Intel i3, i5, i7 и видеокартой nVidia GeForce 2xxM и более новой.

Asus K42Jv, Asus K52J, etc

Текущий прогресс

В настоящий момент работа идёт на двух фронтах: реализация поддержки в драйвере nouveau и в интерфейсе ядра проприетарного драйвера силами энтузиастов.

Переключение работает, то есть можно запустить Xorg с дискретной видеокартой, однако вывод картинки куда-либо не работает вообще или работает только на внешний CRT дисплей.

Бытует мнение, что в некоторых моделях лэптопов карта физически не подключена ни к одному устройству отображения графики, а трансляция картинки происходит программно во фреймбуфер интегрированного видео Intel. Если это действительно так, то это с лёгкостью объясняет выясненные в ходе работы странности этой «технологии»:

  1. Неспособность видеокарты найти подключенные DFP (Digital Flat Panel)
  2. Прекращение работы экрана при отключении интегрированного видео Intel
  3. Отсутствие возможности отключения встроенного видео в BIOS Setup

Крайне интересно, как в таком случае оно физически связано, на предмет возможности переключения.

nVidia опубликовали следующий интересный документ, в котором описано отличие optimus от переключаемой графики предыдущих поколений. Видеочип в нашем случае действительно headless, аналогично графике tesla той же фирмы, то есть не имеет каких-либо физических выходов для вывода видео.

Были проведены тесты с проприетарным драйвером, показавшие возможность работы чипа в приложениях Cuda и OpenCL, то есть gpgpu приложения способны работать напрямую с устройством, без задействования Xorg. Однако необходима некоторая настройка привилегий для получения возможности запуска таких приложений от обычных пользователей.

В случае OpenGL дело обстоит сложнее, поскольку единственным на сегодняшний день интерфейсом для связи OpenGL с графической подсистемой в нашем случае является GLX в Xorg. Поэтому делались попытки запустить другой экземпляр Xorg с драйвером nVidia при работе сеанса с видео Intel. Идея была в том, чтобы подсоединиться к этому другому экземпляру Xorg и запускать программы, использующие OpenGL. Подход несомненно имеет множество недостатков, однако он мог бы быть единственным возможным на текущий момент способом использовать аппаратное ускорение OpenGL, которое может дать GPU от nVidia. Однако сделать это пока не удалось, по непонятным причинам Xorg не запускается, когда работает графическая подсистема Intel. При запуске второго сервера X можно видеть попытку переключения экрана, если расценивать то, что происходит с картинкой в этот момент именно так.

Где драйвер

Nouveau — в ядре, проприетарный — тут:

https://launchpad.net/~kayo-k11-4/+archive/nv-switcheroo

Почему используется бета версия драйвера 270.29 вместо стабильных 260.x? В ней реализована поддержка загрузки vBIOS средствами ACPI, что является единственной возможностью для запуска драйвера на некоторых устройствах.

Тестирование

В Ubuntu:

sudo add-apt-repository ppa:kayo-k11-4/nv-switcheroo

sudo apt-get update
sudo apt-get install nvidia-current

tail -f /var/log/syslog

sudo rmmod nvidia
sudo modprobe nvidia-current

VGA switcheroo NV handler: Success evaluate _DSM!
VGA switcheroo NV handler: Found DSM Compatible device 0000:00:02.0.
VGA switcheroo NV handler: Success evaluate _DSM!
VGA switcheroo NV handler: Found DSM Compatible device 0000:01:00.0.
VGA switcheroo NV handler: Detected _DSM switching method \_SB_.PCI0.PEG1.GFX0 handle on device 0000:01:00.0.
nvidia 0000:01:00.0: power state changed by ACPI to D0
nvidia 0000:01:00.0: power state changed by ACPI to D0
nvidia 0000:01:00.0: enabling device (0000 -> 0003)
nvidia 0000:01:00.0: PCI INT A -> GSI 16 (level, low) -> IRQ 16
nvidia 0000:01:00.0: setting latency timer to 64
vgaarb: device changed decodes: PCI:0000:01:00.0,olddecodes=io+mem,decodes=none:owns=none
NVRM: loading NVIDIA UNIX x86_64 Kernel Module  260.19.06  Mon Sep 13 04:29:19 PDT 2010
VGA switcheroo NV client: Register client.
vga_switcheroo: enabled

ls /sys/kernel/debug | grep vgaswitcheroo

lspci | grep VGA
cat /sys/kernel/debug/vgaswitcheroo/switch

00:02.0 VGA compatible controller: Intel Corporation Core Processor Integrated Graphics Controller (rev 12)
01:00.0 VGA compatible controller: nVidia Corporation GT215 [GeForce GT 335M] (rev a2)
0:+:Pwr:0000:00:02.0
1: :Pwr:0000:01:00.0

sudo invoke-rc.d gdm stop

echo DIS | sudo tee /sys/kernel/debug/vgaswitcheroo/switch

VGA switcheroo NV client: Can switch? Yes
VGA switcheroo NV handler: Switch MUX to: External (Speed)
VGA switcheroo NV handler: Success evaluate _DSM!
i915: switched off

Здесь дискретная видеокарта уже включена так что записи о том, что она включается, нет.

00:02.0 VGA compatible controller: Intel Corporation Core Processor Integrated Graphics Controller (rev 12)
01:00.0 VGA compatible controller: nVidia Corporation GT215 [GeForce GT 335M] (rev a2)
0: :Off:0000:00:02.0
1:+:Pwr:0000:01:00.0

sudo nvidia-xconfig

sudo invoke-rc.d gdm start

Что нас интересует в отчёте

  1. Вендор и модель устройства
  2. Модель процессора и видеокарты
  3. Удалось ли загрузить драйвер
  4. Удалось ли запустить Xorg
  5. Обнаруживается ли дисплей

Примерная форма отчёта

Asus K42Jv i3 GT335M драйвер:да xorg:да картинка:нет

Соучастие

Всячески приветствуется любая помощь в решении проблемы. Минимум, что можно сделать, принять участие в тестировании. Максимум: помочь в анализе DSDT.dsl и кода интерфейса ядра драйвера nVidia.

Как принять участие

Если вы можете оказать бо́́́́́льшую помощь, чем просто тестирование, предлагаю поступить следующим образом:

  1. Прочитать про извлечение и анализ ACPI SL тут.
  2. Аналиировать DSDT.dsl своей системы с целью выявления способа переключения 
  3. Анализировать nvacpi.c nv.c в /usr/src/nvidia-current-VERSION
  4. Анализировать реализацию nouveau в ядре linux
  5. Пробовать и делиться своими соображениями на тему

Где взять патч

Если ваша операционная система отлична от Debian-подобных, то текущую версию патча можно взять в конце этого документа.