Como instalar o driver proprietário AMD Catalyst(FGLRX) no Debian Jessie(8.5) com kernel 4.9


Como instalar o driver proprietário AMD Catalyst(FGLRX) no Debian Jessie(8.5) com kernel 4.9

Atualização: Como instalar o driver proprietário AMD Catalyst(FGLRX) no Debian 8(Jessie) com kernel 4.10


Descição do problema


Para instalar o driver proprietário AMD Catalyst(FGLRX) no Debian Jessie com kernel 4.9 é necessário alterar o arquivo firegl_public.c que fica no diretório do source do módulo /usr/src/fglrx-15.12/.
O motivo desta alteração é uma alteração no arquivo linux-4.9/include/linux/mm.h nas linhas 1274 a 1277, onde a função foi alterada para receber menos argumentos:

Kernel 4.8.6
long get_user_pages_remote(struct task_struct *tsk, struct mm_struct *mm, 
unsigned long start, unsigned long nr_pages, 
int write, int force, struct page **pages, 
struct vm_area_struct **vmas);

Kernel 4.9
long get_user_pages_remote(struct task_struct *tsk, struct mm_struct *mm, 
unsigned long start, unsigned long nr_pages, 
unsigned int gup_flags, struct page **pages, 
struct vm_area_struct **vmas);

Perceba que antes era: int write, int force, struct page **pages, e depois ficou: unsigned int gup_flags, struct page **pages,
O argumento int write foi mudado para unsigned int gup_flags e o argumento int force foi extinto.
As alterações no arquivo firegl_public.c foram feitas por mim nas linhas 3232 a 3234 e 3259 a 3261.

Este é o patch:
diff -uNr fglrx-15.12-original/firegl_public.c fglrx-15.12-mod/firegl_public.c
--- fglrx-15.12-original/firegl_public.c 2016-12-18 12:55:34.000000000 -0200
+++ fglrx-15.12-mod/firegl_public.c 2016-12-18 13:02:30.000000000 -0200
@@ -3229,7 +3229,11 @@
 
     down_read(&current->mm->mmap_sem);
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(4,6,0)
-    ret = get_user_pages_remote(current, current->mm, vaddr, page_cnt, 1, 0, (struct page **)page_list, NULL);
+    #if LINUX_VERSION_CODE >= KERNEL_VERSION(4,9,0)
+        ret = get_user_pages_remote(current, current->mm, vaddr, page_cnt, 1, (struct page **)page_list, NULL);
+    #else
+        ret = get_user_pages_remote(current, current->mm, vaddr, page_cnt, 1, 0, (struct page **)page_list, NULL);
+    #endif
 #else
     ret = get_user_pages(current, current->mm, vaddr, page_cnt, 1, 0, (struct page **)page_list, NULL);
 #endif
@@ -3250,8 +3254,13 @@
     int ret;
 
     down_read(&current->mm->mmap_sem);
+
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(4,6,0)
-    ret = get_user_pages_remote(current, current->mm, vaddr, page_cnt, 0, 0, (struct page **)page_list, NULL);
+    #if LINUX_VERSION_CODE >= KERNEL_VERSION(4,9,0)
+        ret = get_user_pages_remote(current, current->mm, vaddr, page_cnt, 0, (struct page **)page_list, NULL);
+    #else
+        ret = get_user_pages_remote(current, current->mm, vaddr, page_cnt, 0, 0, (struct page **)page_list, NULL);
+    #endif
 #else
     ret = get_user_pages(current, current->mm, vaddr, page_cnt, 0, 0, (struct page **)page_list, NULL);
#endif

Solução(Método copy / paste)


Primeiro é necessário executar o procedimento descrito em http://dicasinformaticatotal.blogspot.com.br/2016/11/instalacao-do-driver-proprietario-amd.html
Depois baixe o arquivo firegl_public_patched.c de https://github.com/acamargovieira/debian_configs
Copie o arquivo substituindo o arquivo original do módulo:
sudo cp firegl_public_patched.c /usr/src/fglrx-15.12/firegl_public.c
Para recompilar o módulo e instalar execute:
sudo dkms autoinstall -k $(uname -r)

Solução(Método patch)


Para quem quiser aplicar o patch: baixe o arquivo fglrx-15.12-kernel-4.9.patch de https://github.com/acamargovieira/debian_configs
Entre na pasta:
cd /usr/src/fglrx-15.12/
E execute o comando:
sudo patch -p1 < /pasta-onde-esta-o-arquivo-patch-baixado/fglrx-15.12-kernel-4.9.patch
Para recompilar o módulo e instalar execute:
sudo dkms autoinstall -k $(uname -r)

Nota: O Debian vem por padrão com kernel 3.16.0, normalmente compilo e instalo o último kernel disponível no kernel.org, então, quando fiz isto com o kernel 4.9, ocorreram alguns erros e o módulo da placa AMD Radeon não foi instalado corretamente, então encontrei a solução exposta neste post.
logoblog