ATI e Kernel 2.6.16

by Wolf

Il Kernel 2.6.16 ha dei problemi con i driver proprietari ATI, questo documento è stato fatto il 26/03/2006 e si riferisce ai driver 8.23.7.

Faccio per comodità un copia e incolla dall'analoga pagina riguardante una patch per una precedente versione dei driver ATI con il kernel 2.6.15 o superiore (problema però risolto nelle ultime versioni dello stesso driver), questa, apportando poi le modifiche specifiche per questo problema.

Googlando un po' è possibile trovare una piccola patch per il driver, però a differenza del driver Nvidia, che si può decomprimere e patchare, con il driver ATI questa procedura non è possibile.
Nello specifico ho trovato la patch su di un forum in inglese derivante da un sito su Gentoo, la ho poi prodotta io facendo dei test per verificarne il corretto funzionamento.

Applicazione della patch

NOTA BENE: NON MI RITENGO RESPONSABILE PER EVENTUALI DANNI CAUSATI DALLA PROCEDURA SOPRACITATA, QUANTO FATE E' A VOSTRO ESCLUSIVO RISCHIO!

Questa procedura è stata scritta il 26-03-2006, il kernel usato è il 2.6.16
(appena uscito) e la versione del driver ATI è la 8.23.7 (l'ultima
disponibile).

  1. Caricate il sistema con il kernel 2.6.16 (o superiore).
  2. Installate il driver dall'installer con la procedura standard.
  3. Se controllate il dmesg neterete dei messaggi di errore nel caricamento del modulo
  4. Entrate nella directory /lib/modules e installate la patch:
# patch -p0 < percorso_alla_patch

Installazione della versione modificata

  1. Entrate in fglrx/build_mod
  2. Lanciate lo script make.sh contenuto in tale directory
  3. Andate nella directory fglrx (la directory superiore)
  4. Lanciate lo script make_install.sh

Dovrebbe essere a posto, adesso il driver installato dovrebbe funzionare
correttamente!

Patch

La patch riportata qua sotto, potete copiarla e incollarla in un file:

--- fglrx/build_mod/firegl_public.c.orig        2006-03-26 14:30:12.000000000 +0200
+++ fglrx/build_mod/firegl_public.c     2006-03-26 14:38:19.000000000 +0200
@@ -361,13 +361,15 @@ typedef struct firegl_drm_stub_info_tag
 } firegl_drm_stub_info_t;
 static firegl_drm_stub_info_t firegl_stub_info;

-#if LINUX_VERSION_CODE < 0x020400
+#if LINUX_VERSION_CODE > 0x02060F
 struct firegl_drm_stub_info_t *firegl_stub_pointer = NULL;
 #define inter_module_put(x)
 #define inter_module_unregister(x)
 #define inter_module_get_request(x,y)   firegl_stub_pointer
 #define inter_module_register(x,y,z)    do { firegl_stub_pointer = z; } while (0)
+#endif // LINUX_VERSION_CODE > 0x02060F
 /* This is a kludge for backward compatibility that is only useful in DRM(stub_open) */
+#if LINUX_VERSION_CODE < 0x020400
 #define fops_put(fops)      MOD_DEC_USE_COUNT
 #define fops_get(fops)      (fops); MOD_INC_USE_COUNT
 #endif // LINUX_VERSION_CODE < 0x020400