ATI fglrx driver patch for Xen kernel

ATI RadeonシリーズのLinux用のドライバは、そのままXenカーネル用にコンパイルしてinsmodしてXを起動すると、カーネルまで巻き込んでハングアップしてしまう。
ネットを探し回っていろいろといじってみた結果、以下のパッチを当てるとうまく動くようになった。
パッチを当てる対象はバージョン8.30.3


参考:
http://hg.recoil.org/xen-gl.hg


diff -Naru build_mod/firegl_public.c build_mod.xen/firegl_public.c
--- build_mod/firegl_public.c   2006-10-26 22:39:30.000000000 +0900
+++ build_mod.xen/firegl_public.c       2006-11-16 22:47:57.000000000 +0900
@@ -36,6 +36,7 @@

 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,71)
 #if !defined(CONFIG_X86_PC)
+#if !defined(CONFIG_X86_XEN)
 #if !defined(CONFIG_X86_64)
 #if !defined(CONFIG_X86_VOYAGER)
 #if !defined(CONFIG_X86_NUMAQ)
@@ -52,6 +53,7 @@
 #endif
 #endif
 #endif
+#endif
 #endif /* LINUX_VERSION_CODE */

 /* The dirty-page-tracking patch included in NLD 9 SMP kernels defines
diff -Naru build_mod/firegl_public.h build_mod.xen/firegl_public.h
--- build_mod/firegl_public.h   2006-10-26 22:39:30.000000000 +0900
+++ build_mod.xen/firegl_public.h       2006-11-16 22:48:06.000000000 +0900
@@ -32,8 +32,13 @@

 #if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,9)

+#ifdef CONFIG_XEN
+#define REMAP_PAGE_RANGE_FN io_remap_pfn_range
+#define REMAP_PAGE_RANGE_STR "io_remap_pfn_range"
+#else
 #define REMAP_PAGE_RANGE_FN remap_pfn_range
 #define REMAP_PAGE_RANGE_STR "remap_pfn_range"
+#endif
 #define REMAP_PAGE_RANGE_OFF(offset) ((offset) >> PAGE_SHIFT)

 #else /* LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,9) */
@@ -44,12 +49,21 @@

 #endif /* LINUX_VERSION_CODE > KERNEL_VERSION(2,6,9) */

+#ifdef CONFIG_XEN
+#define REMAP_PAGE_RANGE(vma,offset) \
+    REMAP_PAGE_RANGE_FN((vma), \
+                        (vma)->vm_start,       \
+                        REMAP_PAGE_RANGE_OFF(offset), \
+                        (vma)->vm_end - (vma)->vm_start, \
+                        (vma)->vm_page_prot)
+#else
 #define REMAP_PAGE_RANGE(vma,offset) \
     REMAP_PAGE_RANGE_FN(FGL_VMA_API_PASS \
                         (vma)->vm_start,       \
                         REMAP_PAGE_RANGE_OFF(offset), \
                         (vma)->vm_end - (vma)->vm_start, \
                         (vma)->vm_page_prot)
+#endif


 /* Page table macros */
diff -Naru build_mod/make.sh build_mod.xen/make.sh
--- build_mod/make.sh   2006-10-26 22:39:30.000000000 +0900
+++ build_mod.xen/make.sh       2006-11-16 22:47:57.000000000 +0900
@@ -788,10 +788,15 @@
   pgprot_t prot;

   return (
+#ifdef CONFIG_X86_XEN
+    io_remap_page_range(
+      vma,
+#else
     remap_page_range(
 #ifdef FGL_LINUX253P1_VMA_API
       vma,
 #endif
+#endif
       from, to, size, prot)
     );
 }


Usage:

$ # Download driver installer from ATI(AMD)'s website
$ sh ati-driver-installer-8.30.3.run --extract
$ cd fglrx-install/common/lib/modules/fglrx/build_mod
$ patch -p1 < THE_PATCH_ABOVE.patch
$ cp ../../../../../arch/x86/lib/modules/fglrx/build_mod/libfglrx_ip.a.GCC* ./
$ sh make.sh