wtorek, 31 października 2017

AMDGPU dla GCN1 i GCN2 i kerneli >=4.13

Jak część z Was wie, od jakiegoś czasu użytkownicy posiadający w swych zestawach karty graficzne AMD zbudowane w architekturze GCN1 (Southern Islands) oraz GCN2 (Sea Islands) mogą korzystać z dwu rodzajów sterowników otwartych: ati, zwany również radeon (paczka xf86-video-ati) oraz amdgpu (paczka xf86-video-amdgpu). Mogą również korzystać z własnościowych sterowników Catalyst, jednakże nie polecam tego rozwiązania, albowiem od końca 2015 roku projekt ten nie jest już rozwijany, a nadto wymaga sporych zmian w systemie. Pozostańmy zatem przy dwu otwartoźródłowych rozwiązaniach. Pamiętajmy, że wsparcie dla GCN1 i GCN2 w kernelu jest w dalszym ciągu określane jako "eksperymentalne". Niemniej jednak - o ile wiem - we wszystkich kernelach obecnie oferowanych jest ono włączone. Musimy również pamiętać, że wsparcie to jest z wersji kernela na kernel lepsze, a zatem w przypadku korzystania z kernela linux-lts (obecnie to wersja 4.9) sensowniej będzie użyć sterownika ATI. Pozostańmy zatem przy kernelu z linii 4.13 dostarczanym w repozytorium. Są to trzy kernele: linux, linux-zen oraz linux-hardened. Na tych kernelach możemy pokusić się o uruchomienie sterownika AMDGPU i cieszyć się jego, ponoć lepszą, wydajnością. Nie ograniczymy się jednak wyłącznie do zainstalowania sterownika xf86-video-amdgpu, albowiem po jego instalacji i tak system będzie pracować albo na sterowniku ATI albo na modesetting. Instalację musimy rozpocząć od sprawdzenia kilku rzeczy. Po pierwsze musimy upewnić się, czy nasza karta jest zbudowana w architekturze GCN1 lub GCN2. Niestety na nic przyjdą tu informacje, jakie o karcie potrafią nam przekazać takie programy jak np. inxi, czy systemowe polecenie lspci, choć będą one pomocne. Na ich podstawie bowiem możemy określić jak nazywa się nasze GPU. Polecam konsolowe inxi, bo daje pełniejszą wiedzę. Zaczynamy zatem od wydania polecenia:
inxi -Gxx
Wyświetli się nam m.in. pozycja "Card" a obok niej nazwa naszego układu. Wyposażeni w taką wiedzę, próbujmy szukać szczęścia pośród informacji dostępnych np. w wikipedii. Niestety niekiedy trzeba będzie poszukać w niej dalej, co pozostawiam już Waszej domyślności. Jeśli nasz układ został zbudowany w architekturze GCN1 lub GCN2 możemy przystąpić do dalszych działań. Upewnijmy się, że kernel został odpowiednio zbudowany i dostarcza wsparcia dla AMDGPU. Wydajmy polecenie:
zgrep -i CONFIG_DRM_AMDGPU /proc/config.gz
Pośród zwróconej odpowiedzi musimy znaleźć CONFIG_DRM_AMDGPU_SI=Y dla układów GCN1 lub CONFIG_DRM_AMDGPU_CIK=Y dla układów GCN2. Jeśli nie zobaczymy ich, to musimy przebudować kernel, albo... pozostać przy sterownikach ATI. Załóżmy, że zarówno nasza karta, jak i wykorzystywany kernel umożliwia nam spróbowanie pracy na AMDGPU. W pierwszej kolejności instalujemy sterownik:
# pacman -Syu xf86-video-amdgpu
Pamiętajmy jednak, że paczka ta wcale nie jest konieczna do działania sterownika AMDGPU. Ten jest bowiem wbudowany w kernel. Paczka powoduje natomiast przyspieszenie działania Xorg, zawierając sterownik DDX. To oznacza, że możemy się cieszyć akceleracją, ale wyłącznie 2D. Za akcelerację 3D odpowiada mesa-vdpau (i lib32-mesa-vdpau dla aplikacji 32bitowych w środowisku 64bitowym). Teraz, prawdopodobnie, mamy w systemie oba sterowniki: ATI oraz AMDGPU. W takim układzie, system uruchomi się na sterowniku ATI. Po pierwsze, prawdopodobnie kernelowi przekazany zostało wyłącznie wywołanie modułu radeon. Po drugie i tak ATI (lub modesettings) pozostanie w takim układzie domyślny. Możemy to zmienić na dwa sposoby. Pierwszy, to zmiana pliku /etc/mkinitcpio.conf i poinformowanie kernela tak o tym, by moduł amdgpu został wywołany i to wywołany jako pierwszy (przed radeon). Potem musimy jeszcze przebudować obraz kernela, a zatem (nano jest tylko przykładowym edytorem):
# nano /etc/mkinitcpio.conf
Odszukujemy sekcję MODULES i dopisujemy tam amdgpu umieszczając przed radeon. Wpis ma wyglądać tak (trzykropek zastępuje inne, ewentualnie istniejące w tym wpisie moduły):
MODULES="... amdgpu radeon ...
Teraz należy przebudować obraz kernela:
# mkinitcpio -p linux
W miejscu linux wpisujemy nazwę kernela do przebudowania. Drugą metodą, jest umieszczenie radeon pośród tzw. blacklists. Możemy tego dokonać również na dwa sposoby. Pierwszym jest utworzenie pliku (nazwa przykładowa) /etc/modprobe.d/blacklist.conf, w którym wpisujemy: blacklist radeon. Drugim to dopisanie do modułów kernela: modprobe.blacklist=radeon. W drugim przypadku, używając GRUB2, dokonujemy edycji pliku /etc/default/grub (nie będę się już powtarzać, wyżej zostało opisane w jaki sposób edytować pliki systemowe), odszukujemy sekcję GRUB_CMDLINE_LINUX_DEFAULT i tam dopisujemy modprobe.blacklist=radeon. Stosowna sekcja (znów "..." zastępuje inne wpisy) wyglądać winna tak:
GRUB_CMDLINE_LINUX_DEFAULT="... modprobe.blacklist=radeon ..."
Teraz trzeba przebudować GRUB (ale o tym dalej). W przypadku kernela linii 4.13 musimy mu jeszcze przekazać instrukcję, by podniósł moduł amdgpu oraz nie podnosił radeonsi. W przypadku GRUB2, w tej samej linii co poprzednio dopisujemy: - dla GCN1:
GRUB_CMDLINE_LINUX_DEFAULT "...amdgpu.si_support=1 radeon.si_support=0..."
- dla GCN2:
GRUB_CMDLINE_LINUX_DEFAULT "...amdgpu.cik_support=1 radeon.cik_support=0..."
Po dokonaniu tych wszystkich wpisów przeładowujemy GRUB2:
# grub-mkconfig -o /boot/grub/grub.cfg
Do pełni szczęścia brakuje nam jeszcze akceleracji 3D. Jeśli zatem nie mamy jej jeszcze uruchomionej, to instalujemy sterownik mesa-vdpau. Od tej chwili, po restarcie winniśmy się cieszyć nowym sterownikiem. Sprawdzamy np. przez inxi. Teraz kilka uwag, czyli czas podzielić się innymi doświadczeniami. Po pierwsze - mam ustawiony tzw. early start KMS z wpisanym modułem amdgpu przed radeon, co teoretycznie winno wystarczyć, by ten pierwszy ładował się jako domyślny. Z drugiej jednak strony umieściłem radeon w blacklist. Z jakiegoś powodu dopiero takie rozwiązanie pomogło, a obecnie nie chce mi się bawić w sprawdzanie innych, skoro takie rozwiązanie działa prawidłowo. Po drugie i ważniejsze. W przypadku mojej karty, próba odszukania czy jest należy on do GCN1, czy GCN2 uparcie przynosiła informację, że należy do Southern Islands, a zatem stosowne wpisy dla kernela, to SI. Wprowadzenie jednak takich parametrów dla kernela nic jednak nie dawało, albowiem jest on rozpoznawany jako GCN2 (CIK). Dopiero użycie takich parametrów spowodowało pracę AMDGPU. Proponuję zatem wykonanie startu na próbę wpierw z jednym, a potem z drugim parametrem. Jeden z nich będzie prawidłowy i taki należy wprowadzić do pliku konfigurującego GRUB2. Po trzecie. Istnieje jeszcze sterownik AMDGPU-PRO. Pomijam już sam fakt, że nie ma on wsparcia dla Arch Linux (jest to sterownik własnościowy i rozpowszechniany jest wyłącznie jako paczka deb lub rpm; stosowne PKGBUILDy znajdują się jednak w AUR), to ten sterownik w żaden sposób nie jest przeznaczony dla układów GCN1 i GCN2. Niech Was zatem przez przypadek nie zwiedzie zarówno zbliżona nazwa, jak i to, że w tym przypadku "pro" wcale nie oznacza, że coś jest lepsze. Po prostu nie jest przeznaczone dla tych układów. Tekst powstał m.in. w oparciu o materiał w wiki Archa i tam też więcej się dowiecie.