about summary refs log tree commit diff
path: root/nixpkgs/pkgs/os-specific/linux/ati-drivers
diff options
context:
space:
mode:
authorAlyssa Ross <hi@alyssa.is>2019-01-07 02:18:36 +0000
committerAlyssa Ross <hi@alyssa.is>2019-01-07 02:18:47 +0000
commit36f56d99fa0a0765c9f1de4a5f17a9b05830c3f2 (patch)
treeb3faaf573407b32aa645237a4d16b82778a39a92 /nixpkgs/pkgs/os-specific/linux/ati-drivers
parent4e31070265257dc67d120c27e0f75c2344fdfa9a (diff)
parentabf060725d7614bd3b9f96764262dfbc2f9c2199 (diff)
downloadnixlib-36f56d99fa0a0765c9f1de4a5f17a9b05830c3f2.tar
nixlib-36f56d99fa0a0765c9f1de4a5f17a9b05830c3f2.tar.gz
nixlib-36f56d99fa0a0765c9f1de4a5f17a9b05830c3f2.tar.bz2
nixlib-36f56d99fa0a0765c9f1de4a5f17a9b05830c3f2.tar.lz
nixlib-36f56d99fa0a0765c9f1de4a5f17a9b05830c3f2.tar.xz
nixlib-36f56d99fa0a0765c9f1de4a5f17a9b05830c3f2.tar.zst
nixlib-36f56d99fa0a0765c9f1de4a5f17a9b05830c3f2.zip
Add 'nixpkgs/' from commit 'abf060725d7614bd3b9f96764262dfbc2f9c2199'
git-subtree-dir: nixpkgs
git-subtree-mainline: 4e31070265257dc67d120c27e0f75c2344fdfa9a
git-subtree-split: abf060725d7614bd3b9f96764262dfbc2f9c2199
Diffstat (limited to 'nixpkgs/pkgs/os-specific/linux/ati-drivers')
-rw-r--r--nixpkgs/pkgs/os-specific/linux/ati-drivers/builder.sh302
-rw-r--r--nixpkgs/pkgs/os-specific/linux/ati-drivers/default.nix140
-rw-r--r--nixpkgs/pkgs/os-specific/linux/ati-drivers/patches/15.12-xstate-fp.patch26
-rw-r--r--nixpkgs/pkgs/os-specific/linux/ati-drivers/patches/15.9-kcl_str.patch14
-rw-r--r--nixpkgs/pkgs/os-specific/linux/ati-drivers/patches/15.9-mtrr.patch27
-rw-r--r--nixpkgs/pkgs/os-specific/linux/ati-drivers/patches/15.9-preempt.patch103
-rw-r--r--nixpkgs/pkgs/os-specific/linux/ati-drivers/patches/15.9-sep_printf.patch11
-rw-r--r--nixpkgs/pkgs/os-specific/linux/ati-drivers/patches/4.7-arch-cpu_has_pge-v2.patch70
-rw-r--r--nixpkgs/pkgs/os-specific/linux/ati-drivers/patches/4.9-get_user_pages.patch28
-rw-r--r--nixpkgs/pkgs/os-specific/linux/ati-drivers/patches/kernel-4.6-get_user_pages.patch25
-rw-r--r--nixpkgs/pkgs/os-specific/linux/ati-drivers/patches/kernel-4.6-page_cache_release-put_page.patch16
-rw-r--r--nixpkgs/pkgs/os-specific/linux/ati-drivers/patches/patch-samples.patch26
12 files changed, 788 insertions, 0 deletions
diff --git a/nixpkgs/pkgs/os-specific/linux/ati-drivers/builder.sh b/nixpkgs/pkgs/os-specific/linux/ati-drivers/builder.sh
new file mode 100644
index 000000000000..6cb8cacbffac
--- /dev/null
+++ b/nixpkgs/pkgs/os-specific/linux/ati-drivers/builder.sh
@@ -0,0 +1,302 @@
+# TODO gentoo removes some tools because there are xorg sources (?)
+
+source $stdenv/setup
+set -x
+
+die(){ echo $@; exit 1; }
+
+unzip $src
+run_file=fglrx-$build/amd-driver-installer-$build-x86.x86_64.run
+sh $run_file --extract .
+
+for patch in $patches;do
+    patch -p1 < $patch
+done
+
+case "$system" in
+  x86_64-linux)
+    arch=x86_64
+    lib_arch=lib64
+    DIR_DEPENDING_ON_XORG_VERSION=xpic_64a
+  ;;
+  i686-linux)
+    arch=x86
+    lib_arch=lib
+    DIR_DEPENDING_ON_XORG_VERSION=xpic
+  ;;
+  *) exit 1;;
+esac
+
+# Handle/Build the kernel module.
+
+if test -z "$libsOnly"; then
+
+  kernelVersion=$(cd ${kernelDir}/lib/modules && ls)
+  kernelBuild=$(echo ${kernelDir}/lib/modules/$kernelVersion/build)
+  linuxsources=$(echo ${kernelDir}/lib/modules/$kernelVersion/source)
+
+  # note: maybe the .config file should be used to determine this ?
+  # current kbuild infrastructure allows using CONFIG_* defines
+  # but ati sources don't use them yet..
+  # copy paste from make.sh
+
+  setSMP(){
+
+    linuxincludes=$kernelBuild/include
+
+    # copied and stripped. source: make.sh:
+    # 3
+    # linux/autoconf.h may contain this: #define CONFIG_SMP 1
+
+    # Before 2.6.33 autoconf.h is under linux/.
+    # For 2.6.33 and later autoconf.h is under generated/.
+    if [ -f $linuxincludes/generated/autoconf.h ]; then
+        autoconf_h=$linuxincludes/generated/autoconf.h
+    else
+        autoconf_h=$linuxincludes/linux/autoconf.h
+    fi
+    src_file=$autoconf_h
+
+    [ -e $src_file ] || die "$src_file not found"
+
+    if [ `cat $src_file | grep "#undef" | grep "CONFIG_SMP" -c` = 0 ]; then
+      SMP=`cat $src_file | grep CONFIG_SMP | cut -d' ' -f3`
+      echo "file $src_file says: SMP=$SMP"
+    fi
+
+    if [ "$SMP" = 0 ]; then
+      echo "assuming default: SMP=$SMP"
+    fi
+    # act on final result
+    if [ ! "$SMP" = 0 ]; then
+      smp="-SMP"
+      def_smp=-D__SMP__
+    fi
+
+  }
+
+  setModVersions(){
+    ! grep CONFIG_MODVERSIONS=y $kernelBuild/.config ||
+    def_modversions="-DMODVERSIONS"
+    # make.sh contains much more code to determine this whether its enabled
+  }
+
+  # ==============================================================
+  # resolve if we are building for a kernel with a fix for CVE-2010-3081
+  # On kernels with the fix, use arch_compat_alloc_user_space instead
+  # of compat_alloc_user_space since the latter is GPL-only
+
+  COMPAT_ALLOC_USER_SPACE=arch_compat_alloc_user_space
+
+  for src_file in \
+    $kernelBuild/arch/x86/include/asm/compat.h \
+    $linuxsources/arch/x86/include/asm/compat.h \
+    $kernelBuild/include/asm-x86_64/compat.h \
+    $linuxsources/include/asm-x86_64/compat.h \
+    $kernelBuild/include/asm/compat.h;
+  do
+    if [ -e $src_file ];
+    then
+      break
+    fi
+  done
+  if [ ! -e $src_file ];
+    then
+    echo "Warning: x86 compat.h not found in kernel headers"
+    echo "neither arch/x86/include/asm/compat.h nor include/asm-x86_64/compat.h"
+    echo "could be found in $kernelBuild or $linuxsources"
+    echo ""
+  else
+    if [ `cat $src_file | grep -c arch_compat_alloc_user_space` -gt 0 ]
+    then
+      COMPAT_ALLOC_USER_SPACE=arch_compat_alloc_user_space
+    fi
+    echo "file $src_file says: COMPAT_ALLOC_USER_SPACE=$COMPAT_ALLOC_USER_SPACE"
+  fi
+
+  # make.sh contains some code figuring out whether to use these or not..
+  PAGE_ATTR_FIX=0
+  setSMP
+  setModVersions
+  CC=gcc
+  MODULE=fglrx
+  LIBIP_PREFIX=$TMP/arch/$arch/lib/modules/fglrx/build_mod
+  [ -d $LIBIP_PREFIX ]
+  GCC_MAJOR="`gcc --version | grep -o -e ") ." | head -1 | cut -d " " -f 2`"
+
+  { # build .ko module
+    cd ./common/lib/modules/fglrx/build_mod/2.6.x
+    echo .lib${MODULE}_ip.a.GCC${GCC_MAJOR}.cmd
+    echo 'This is a dummy file created to suppress this warning: could not find /lib/modules/fglrx/build_mod/2.6.x/.libfglrx_ip.a.GCC4.cmd for /lib/modules/fglrx/build_mod/2.6.x/libfglrx_ip.a.GCC4' > lib${MODULE}_ip.a.GCC${GCC_MAJOR}.cmd
+
+    sed -i -e "s@COMPAT_ALLOC_USER_SPACE@$COMPAT_ALLOC_USER_SPACE@" ../kcl_ioctl.c
+
+    make CC=${CC} \
+      LIBIP_PREFIX=$(echo "$LIBIP_PREFIX" | sed -e 's|^\([^/]\)|../\1|') \
+      MODFLAGS="-DMODULE -DATI -DFGL -DPAGE_ATTR_FIX=$PAGE_ATTR_FIX -DCOMPAT_ALLOC_USER_SPACE=$COMPAT_ALLOC_USER_SPACE $def_smp $def_modversions" \
+      KVER=$kernelVersion \
+      KDIR=$kernelBuild \
+      PAGE_ATTR_FIX=$PAGE_ATTR_FIX \
+      -j4
+
+    cd $TMP
+  }
+
+fi
+
+{ # install
+  mkdir -p $out/lib/xorg
+  cp -r common/usr/include $out
+  cp -r common/usr/sbin $out
+  cp -r common/usr/share $out
+  mkdir $out/bin/
+  cp -f common/usr/X11R6/bin/* $out/bin/
+  # cp -r arch/$arch/lib $out/lib
+  # what are those files used for?
+  cp -r common/etc $out
+  cp -r $DIR_DEPENDING_ON_XORG_VERSION/usr/X11R6/$lib_arch/* $out/lib/xorg
+
+  # install kernel module
+  if test -z "$libsOnly"; then
+    t=$out/lib/modules/${kernelVersion}/kernel/drivers/misc
+    mkdir -p $t
+
+    cp ./common/lib/modules/fglrx/build_mod/2.6.x/fglrx.ko $t
+  fi
+
+  # should this be installed at all?
+  # its used by the example fglrx_gamma only
+  # don't use $out/lib/modules/dri because this will cause the kernel module
+  # aggregator code to see both: kernel version and the dri direcotry. It'll
+  # fail saying different kernel versions
+  cp -r $TMP/arch/$arch/usr/X11R6/$lib_arch/modules/dri $out/lib
+  cp -r $TMP/arch/$arch/usr/X11R6/$lib_arch/modules/dri/* $out/lib
+  cp -r $TMP/arch/$arch/usr/X11R6/$lib_arch/*.so* $out/lib
+  cp -r $TMP/arch/$arch/usr/X11R6/$lib_arch/fglrx/fglrx-libGL.so.1.2 $out/lib/fglrx-libGL.so.1.2
+  cp -r $TMP/arch/$arch/usr/$lib_arch/* $out/lib
+  ln -s libatiuki.so.1.0 $out/lib/libatiuki.so.1
+  ln -s fglrx-libGL.so.1.2 $out/lib/libGL.so.1
+  ln -s fglrx-libGL.so.1.2 $out/lib/libGL.so
+  # FIXME : This file is missing or has changed versions
+  #ln -s libfglrx_gamma.so.1.0 $out/lib/libfglrx_gamma.so.1
+  # make xorg use the ati version
+  ln -s $out/lib/xorg/modules/extensions/{fglrx/fglrx-libglx.so,libglx.so}
+  # Correct some paths that are hardcoded into binary libs.
+  if [ "$arch" ==  "x86_64" ]; then
+    for lib in \
+      xorg/modules/extensions/fglrx/fglrx-libglx.so \
+      xorg/modules/glesx.so \
+      dri/fglrx_dri.so \
+      fglrx_dri.so \
+      fglrx-libGL.so.1.2
+    do
+      oldPaths="/usr/X11R6/lib/modules/dri"
+      newPaths="/run/opengl-driver/lib/dri"
+      sed -i -e "s|$oldPaths|$newPaths|" $out/lib/$lib
+    done
+  else
+    oldPaths="/usr/X11R6/lib32/modules/dri\x00/usr/lib32/dri"
+    newPaths="/run/opengl-driver-32/lib/dri\x00/dev/null/dri"
+    sed -i -e "s|$oldPaths|$newPaths|" \
+      $out/lib/xorg/modules/extensions/fglrx/fglrx-libglx.so
+
+    for lib in \
+      dri/fglrx_dri.so \
+      fglrx_dri.so \
+      xorg/modules/glesx.so
+    do
+      oldPaths="/usr/X11R6/lib32/modules/dri/"
+      newPaths="/run/opengl-driver-32/lib/dri"
+      sed -i -e "s|$oldPaths|$newPaths|" $out/lib/$lib
+    done
+
+    oldPaths="/usr/X11R6/lib32/modules/dri\x00"
+    newPaths="/run/opengl-driver-32/lib/dri"
+    sed -i -e "s|$oldPaths|$newPaths|" $out/lib/fglrx-libGL.so.1.2
+  fi
+  # libstdc++ and gcc are needed by some libs
+  for pelib1 in \
+    fglrx_dri.so \
+    dri/fglrx_dri.so
+  do
+    patchelf --remove-needed libX11.so.6 $out/lib/$pelib1
+  done
+
+  for pelib2 in \
+    libatiadlxx.so \
+    xorg/modules/glesx.so \
+    dri/fglrx_dri.so \
+    fglrx_dri.so \
+    libaticaldd.so
+  do
+    patchelf --set-rpath $glibcDir/lib/:$libStdCxx/lib/ $out/lib/$pelib2
+  done
+}
+
+if test -z "$libsOnly"; then
+
+{ # build samples
+  mkdir -p $out/bin
+  mkdir -p samples
+  cd samples
+  tar xfz ../common/usr/src/ati/fglrx_sample_source.tgz
+  eval "$patchPhaseSamples"
+
+
+  ( # build and install fgl_glxgears
+    cd fgl_glxgears;
+    gcc -DGL_ARB_texture_multisample=1 -g \
+    -I$libGLU_combined/include \
+    -I$out/include \
+    -L$libGLU_combined/lib -lGL -lGLU -lX11 -lm \
+    -o $out/bin/fgl_glxgears -Wall fgl_glxgears.c
+  )
+
+  true || ( # build and install
+
+    ###
+    ## FIXME ?
+    # doesn't build  undefined reference to `FGLRX_X11SetGamma'
+    # which should be contained in -lfglrx_gamma
+    # This should create $out/lib/libfglrx_gamma.so.1.0 ? because there is
+    # a symlink named libfglrx_gamma.so.1 linking to libfglrx_gamma.so.1.0 in $out/lib/
+
+    cd programs/fglrx_gamma
+    gcc -fPIC -I${libXxf86vm.dev}/include \
+      -I${xf86vidmodeproto}/include \
+      -I$out/X11R6/include \
+      -L$out/lib \
+      -Wall -lm -lfglrx_gamma -lX11 -lXext -o $out/bin/fglrx_xgamma fglrx_xgamma.c
+  )
+
+  {
+    # patch and copy statically linked qt libs used by amdcccle
+    patchelf --set-interpreter $(echo $glibcDir/lib/ld-linux*.so.2) $TMP/arch/$arch/usr/share/ati/$lib_arch/libQtCore.so.4 &&
+    patchelf  --set-rpath $gcc/$lib_arch/ $TMP/arch/$arch/usr/share/ati/$lib_arch/libQtCore.so.4 &&
+    patchelf --set-rpath $gcc/$lib_arch/:$out/share/ati/:$libXrender/lib/:$libSM/lib/:$libICE/lib/:$libfontconfig/lib/:$libfreetype/lib/ $TMP/arch/$arch/usr/share/ati/$lib_arch/libQtGui.so.4 &&
+    mkdir -p $out/share/ati
+    cp -r $TMP/arch/$arch/usr/share/ati/$lib_arch/libQtCore.so.4 $out/share/ati/
+    cp -r $TMP/arch/$arch/usr/share/ati/$lib_arch/libQtGui.so.4 $out/share/ati/
+    # copy binaries and wrap them:
+    BIN=$TMP/arch/$arch/usr/X11R6/bin
+    patchelf --set-rpath $gcc/$lib_arch/:$out/share/ati/:$libXinerama/lib/:$libXrandr/lib/ $TMP/arch/$arch/usr/X11R6/bin/amdcccle
+    patchelf --set-rpath $libXrender/lib/:$libXrandr/lib/ $TMP/arch/$arch/usr/X11R6/bin/aticonfig
+    patchelf --shrink-rpath $BIN/amdcccle
+    for prog in $BIN/*; do
+      cp -f $prog $out/bin &&
+      patchelf --set-interpreter $(echo $glibcDir/lib/ld-linux*.so.2) $out/bin/$(basename $prog) &&
+      wrapProgram $out/bin/$(basename $prog) --prefix LD_LIBRARY_PATH : $out/lib/:$gcc/lib/:$out/share/ati/:$libXinerama/lib/:$libXrandr/lib/:$libfontconfig/lib/:$libfreetype/lib/:$LD_LIBRARY_PATH
+    done
+  }
+
+  rm -f $out/lib/fglrx/switchlibglx && rm -f $out/lib/fglrx/switchlibGL
+
+}
+
+fi
+
+for p in $extraDRIlibs; do
+  for lib in $p/lib/*.so*; do
+    ln -s $lib $out/lib/
+  done
+done
diff --git a/nixpkgs/pkgs/os-specific/linux/ati-drivers/default.nix b/nixpkgs/pkgs/os-specific/linux/ati-drivers/default.nix
new file mode 100644
index 000000000000..bc35d14321b4
--- /dev/null
+++ b/nixpkgs/pkgs/os-specific/linux/ati-drivers/default.nix
@@ -0,0 +1,140 @@
+{ stdenv, lib, fetchurl, kernel ? null, which
+, xorg, makeWrapper, glibc, patchelf, unzip
+, fontconfig, freetype, libGLU_combined # for fgl_glxgears
+, # Whether to build the libraries only (i.e. not the kernel module or
+  # driver utils). Used to support 32-bit binaries on 64-bit
+  # Linux.
+  libsOnly ? false
+}:
+
+assert (!libsOnly) -> kernel != null;
+
+with stdenv.lib;
+
+# This derivation requires a maximum of gcc49, Linux kernel 4.1 and xorg.xserver 1.17
+# and will not build or run using versions newer
+
+# If you want to use a different Xorg version probably
+# DIR_DEPENDING_ON_XORG_VERSION in builder.sh has to be adopted (?)
+# make sure libglx.so of ati is used. xorg.xorgserver does provide it as well
+# which is a problem because it doesn't contain the xorgserver patch supporting
+# the XORG_DRI_DRIVER_PATH env var.
+# See https://marc.info/?l=nix-dev&m=139641585515351 for a
+# workaround (TODO)
+
+# The gentoo ebuild contains much more "magic" and is usually a great resource to
+# find patches XD
+
+# http://wiki.cchtml.com/index.php/Main_Page
+
+# /usr/lib/dri/fglrx_dri.so must point to /run/opengl-driver/lib/fglrx_dri.so
+# This is done in the builder script.
+
+stdenv.mkDerivation rec {
+
+  version = "15.12";
+  pname = "ati-drivers";
+  build = "15.302";
+
+  linuxonly =
+    if stdenv.hostPlatform.system == "i686-linux" then
+      true
+    else if stdenv.hostPlatform.system == "x86_64-linux" then
+      true
+    else throw "ati-drivers are Linux only. Sorry. The build was stopped.";
+
+  name = pname + "-" + version + (optionalString (!libsOnly) "-${kernelDir.version}");
+
+  builder = ./builder.sh;
+  gcc = stdenv.cc.cc;
+  libXinerama = xorg.libXinerama;
+  libXrandr = xorg.libXrandr;
+  libXrender = xorg.libXrender;
+  libXxf86vm = xorg.libXxf86vm;
+  xf86vidmodeproto = xorg.xf86vidmodeproto;
+  libSM = xorg.libSM;
+  libICE = xorg.libICE;
+  libfreetype = freetype;
+  libfontconfig = fontconfig;
+  libStdCxx = stdenv.cc.cc.lib;
+
+  src = fetchurl {
+    url =
+    "https://www2.ati.com/drivers/linux/radeon-crimson-15.12-15.302-151217a-297685e.zip";
+    sha256 = "704f2dfc14681f76dae3b4120c87b1ded33cf43d5a1d800b6de5ca292bb61e58";
+    curlOpts = "--referer https://www.amd.com/en/support";
+  };
+
+  hardeningDisable = [ "pic" "format" ];
+
+  patchPhaseSamples = "patch -p2 < ${./patches/patch-samples.patch}";
+  patches = [
+    ./patches/15.12-xstate-fp.patch
+    ./patches/15.9-kcl_str.patch
+    ./patches/15.9-mtrr.patch
+    ./patches/15.9-preempt.patch
+    ./patches/15.9-sep_printf.patch ]
+  ++ optionals ( kernel != null &&
+                 (lib.versionAtLeast kernel.version "4.6") )
+               [ ./patches/kernel-4.6-get_user_pages.patch
+                 ./patches/kernel-4.6-page_cache_release-put_page.patch ]
+  ++ optionals ( kernel != null &&
+                 (lib.versionAtLeast kernel.version "4.7") )
+               [ ./patches/4.7-arch-cpu_has_pge-v2.patch ]
+  ++ optionals ( kernel != null &&
+                 (lib.versionAtLeast kernel.version "4.9") )
+               [ ./patches/4.9-get_user_pages.patch ];
+
+  buildInputs =
+    [ xorg.libXrender xorg.libXext xorg.libX11 xorg.libXinerama xorg.libSM
+      xorg.libXrandr xorg.libXxf86vm xorg.xf86vidmodeproto xorg.imake xorg.libICE
+      patchelf
+      unzip
+      libGLU_combined
+      fontconfig
+      freetype
+      makeWrapper
+      which
+    ];
+
+  inherit libsOnly;
+
+  kernelDir = if libsOnly then null else kernel.dev;
+
+  # glibc only used for setting the binaries interpreter
+  glibcDir = glibc.out;
+
+  # outputs TODO: probably many fixes are needed;
+  LD_LIBRARY_PATH = makeLibraryPath
+    [ xorg.libXrender xorg.libXext xorg.libX11 xorg.libXinerama xorg.libSM
+      xorg.libXrandr xorg.libXxf86vm xorg.xf86vidmodeproto xorg.imake xorg.libICE
+      libGLU_combined
+      fontconfig
+      freetype
+      stdenv.cc.cc
+    ];
+
+  # without this some applications like blender don't start, but they start
+  # with nvidia. This causes them to be symlinked to $out/lib so that they
+  # appear in /run/opengl-driver/lib which get's added to LD_LIBRARY_PATH
+
+  extraDRIlibs = [ xorg.libXrandr.out xorg.libXrender.out xorg.libXext.out
+                   xorg.libX11.out xorg.libXinerama.out xorg.libSM.out
+                   xorg.libICE.out ];
+
+  inherit libGLU_combined; # only required to build the examples
+
+  enableParallelBuilding = true;
+
+  meta = with stdenv.lib; {
+    description = "ATI Catalyst display drivers";
+    homepage = http://support.amd.com/us/gpudownload/Pages/index.aspx;
+    license = licenses.unfree;
+    maintainers = with maintainers; [ marcweber offline jgeerds jerith666 ];
+    platforms = platforms.linux;
+    hydraPlatforms = [];
+    # Copied from the nvidia default.nix to prevent a store collision.
+    priority = 4;
+  };
+
+}
diff --git a/nixpkgs/pkgs/os-specific/linux/ati-drivers/patches/15.12-xstate-fp.patch b/nixpkgs/pkgs/os-specific/linux/ati-drivers/patches/15.12-xstate-fp.patch
new file mode 100644
index 000000000000..22e43fc0c7b6
--- /dev/null
+++ b/nixpkgs/pkgs/os-specific/linux/ati-drivers/patches/15.12-xstate-fp.patch
@@ -0,0 +1,26 @@
+From: Krzysztof Kolasa <kkolasa@winsoft.pl>
+Date: Thu, 26 Nov 2015 14:28:46 +0100
+Subject: [PATCH] Patch for kernel 4.4.0-rc2
+
+constant change of name XSTATE_XP to name XFEATURE_MASK_FP
+---
+ firegl_public.c | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+diff --git a/common/lib/modules/fglrx/build_mod/firegl_public.c b/common/lib/modules/fglrx/build_mod/firegl_public.c
+index 3626c7b..f071d42 100644
+--- a/common/lib/modules/fglrx/build_mod/firegl_public.c
++++ b/common/lib/modules/fglrx/build_mod//firegl_public.c
+@@ -6463,7 +6463,11 @@ static int KCL_fpu_save_init(struct task_struct *tsk)
+       if (!(fpu->state->xsave.xsave_hdr.xstate_bv & XSTATE_FP))
+ #else
+ 	  copy_xregs_to_kernel(&fpu->state.xsave);
+-      if (!(fpu->state.xsave.header.xfeatures & XSTATE_FP))
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,4,0)
++      if (!(fpu->state.xsave.header.xfeatures & XFEATURE_MASK_FP))
++#else
++      if (!(fpu->state.xsave.header.xfeatures & XSTATE_FP))
++#endif
+ #endif
+          return 1;
+    } else if (static_cpu_has(X86_FEATURE_FXSR)) {
diff --git a/nixpkgs/pkgs/os-specific/linux/ati-drivers/patches/15.9-kcl_str.patch b/nixpkgs/pkgs/os-specific/linux/ati-drivers/patches/15.9-kcl_str.patch
new file mode 100644
index 000000000000..20c3bc8a169b
--- /dev/null
+++ b/nixpkgs/pkgs/os-specific/linux/ati-drivers/patches/15.9-kcl_str.patch
@@ -0,0 +1,14 @@
+--- a/common/lib/modules/fglrx/build_mod/kcl_str.c	2015-09-13 13:47:30.000000000 -0400
++++ b/common/lib/modules/fglrx/build_mod/kcl_str.c	2015-09-13 13:49:42.000000000 -0400
+@@ -169,7 +169,11 @@ int ATI_API_CALL KCL_STR_Strnicmp(const
+                                   const char* s2,
+                                   KCL_TYPE_SizeSigned count)
+ {
++#if LINUX_VERSION_CODE < KERNEL_VERSION(4,0,0)
+     return strnicmp(s1, s2, count);
++#else
++    return strncasecmp(s1, s2, count);
++#endif
+ }
+ 
+ /** \brief Locate character in string
diff --git a/nixpkgs/pkgs/os-specific/linux/ati-drivers/patches/15.9-mtrr.patch b/nixpkgs/pkgs/os-specific/linux/ati-drivers/patches/15.9-mtrr.patch
new file mode 100644
index 000000000000..bdf70b4ccdc4
--- /dev/null
+++ b/nixpkgs/pkgs/os-specific/linux/ati-drivers/patches/15.9-mtrr.patch
@@ -0,0 +1,27 @@
+--- a/common/lib/modules/fglrx/build_mod/firegl_public.c	2015-09-19 23:43:22.000000000 -0400
++++ b/common/lib/modules/fglrx/build_mod/firegl_public.c	2015-09-19 23:52:07.000000000 -0400
+@@ -3442,7 +3442,11 @@ int ATI_API_CALL KCL_MEM_MTRR_Support(vo
+ int ATI_API_CALL KCL_MEM_MTRR_AddRegionWc(unsigned long base, unsigned long size)
+ {
+ #ifdef CONFIG_MTRR
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,3,0)
++    return arch_phys_wc_add(base, size);
++#else
+     return mtrr_add(base, size, MTRR_TYPE_WRCOMB, 1);
++#endif
+ #else /* !CONFIG_MTRR */
+     return -EPERM;
+ #endif /* !CONFIG_MTRR */
+@@ -3451,7 +3455,12 @@ int ATI_API_CALL KCL_MEM_MTRR_AddRegionW
+ int ATI_API_CALL KCL_MEM_MTRR_DeleteRegion(int reg, unsigned long base, unsigned long size)
+ {
+ #ifdef CONFIG_MTRR
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,3,0)
++    arch_phys_wc_del(reg);
++    return reg;
++#else
+     return mtrr_del(reg, base, size);
++#endif
+ #else /* !CONFIG_MTRR */
+     return -EPERM;
+ #endif /* !CONFIG_MTRR */
diff --git a/nixpkgs/pkgs/os-specific/linux/ati-drivers/patches/15.9-preempt.patch b/nixpkgs/pkgs/os-specific/linux/ati-drivers/patches/15.9-preempt.patch
new file mode 100644
index 000000000000..c6598835133e
--- /dev/null
+++ b/nixpkgs/pkgs/os-specific/linux/ati-drivers/patches/15.9-preempt.patch
@@ -0,0 +1,103 @@
+--- a/common/lib/modules/fglrx/build_mod/firegl_public.c	2015-08-30 17:36:02.000000000 -0400
++++ b/common/lib/modules/fglrx/build_mod/firegl_public.c	2015-08-30 17:39:36.000000000 -0400
+@@ -21,6 +21,8 @@
+ !!! since it requires changes to linux/init/main.c.
+ #endif /* !MODULE */
+ 
++#include <linux/preempt.h>
++
+ // ============================================================
+ #include <linux/version.h>
+ 
+@@ -4997,7 +4999,9 @@ static unsigned int kas_spin_unlock(kas_
+ unsigned long ATI_API_CALL KAS_GetExecutionLevel(void)
+ {
+     unsigned long ret;
++    preempt_disable();
+     ret = kas_GetExecutionLevel();
++    preempt_enable();
+     return ret;
+ }
+ 
+@@ -5022,8 +5026,10 @@ unsigned int ATI_API_CALL KAS_Ih_Execute
+     KCL_DEBUG5(FN_FIREGL_KAS,"0x%08X, 0x%08X\n", ih_routine, ih_context);
+ 
+     //Prevent simultaneous entry on some SMP systems.
++    preempt_disable();
+     if (test_and_set_bit(0, (void *)&(kasContext.in_interrupts[smp_processor_id()])))
+     {
++    	preempt_enable();
+         KCL_DEBUG1(FN_FIREGL_KAS, "The processor is handling the interrupt\n");
+         return IRQ_NONE;
+     }
+@@ -5036,9 +5042,9 @@ unsigned int ATI_API_CALL KAS_Ih_Execute
+ 
+     kasSetExecutionLevel(orig_level);
+     spin_unlock(&kasContext.lock_ih); 
+-
+     clear_bit(0, (void *)&(kasContext.in_interrupts[smp_processor_id()]));
+     KCL_DEBUG5(FN_FIREGL_KAS,"%d\n", ret);
++    preempt_enable();
+ 
+     return ret;
+ }
+@@ -5256,6 +5262,7 @@ unsigned int ATI_API_CALL KAS_Spinlock_A
+ 
+     KCL_DEBUG5(FN_FIREGL_KAS,"0x%08X\n", hSpinLock);
+ 
++    preempt_disable();
+     spin_lock_info.routine_type = spinlock_obj->routine_type;
+     spin_lock_info.plock = &(spinlock_obj->lock);
+ 
+@@ -5263,6 +5270,7 @@ unsigned int ATI_API_CALL KAS_Spinlock_A
+ 
+     spinlock_obj->acquire_type = spin_lock_info.acquire_type;
+     spinlock_obj->flags = spin_lock_info.flags;
++    preempt_enable();
+ 
+     KCL_DEBUG5(FN_FIREGL_KAS,"%d\n", ret);
+     return ret;
+@@ -6034,6 +6042,8 @@ unsigned int ATI_API_CALL KAS_Interlocke
+ 
+     KCL_DEBUG5(FN_FIREGL_KAS,"0x%08X, 0x%08X, 0x%08X\n", hListHead, hListEntry, phPrevEntry);
+ 
++    preempt_disable();
++
+     /* Protect the operation with spinlock */
+     spin_lock_info.routine_type = listhead_obj->routine_type;
+     spin_lock_info.plock = &(listhead_obj->lock);
+@@ -6041,6 +6051,7 @@ unsigned int ATI_API_CALL KAS_Interlocke
+     if (!kas_spin_lock(&spin_lock_info))
+     {
+         KCL_DEBUG_ERROR("Unable to grab list spinlock\n");
++	preempt_enable();
+         return 0; /* No spinlock - no operation */
+     }
+ 
+@@ -6065,6 +6076,7 @@ unsigned int ATI_API_CALL KAS_Interlocke
+     spin_unlock_info.flags = spin_lock_info.flags;
+ 
+     ret = kas_spin_unlock(&spin_unlock_info);
++    preempt_enable();
+     KCL_DEBUG5(FN_FIREGL_KAS,"%d", ret);
+     return ret;
+ }
+@@ -6153,8 +6165,10 @@ unsigned int ATI_API_CALL KAS_Interlocke
+     spin_lock_info.routine_type = listhead_obj->routine_type;
+     spin_lock_info.plock = &(listhead_obj->lock);
+ 
++    preempt_disable();
+     if (!kas_spin_lock(&spin_lock_info))
+     {
++        preempt_enable();
+         KCL_DEBUG_ERROR("Unable to grab list spinlock");
+         return 0; /* No spinlock - no operation */
+     }
+@@ -6178,6 +6192,7 @@ unsigned int ATI_API_CALL KAS_Interlocke
+     spin_unlock_info.flags = spin_lock_info.flags;
+ 
+     ret = kas_spin_unlock(&spin_unlock_info);
++    preempt_enable();
+     KCL_DEBUG5(FN_FIREGL_KAS,"%d", ret);
+     return ret;
+ }
diff --git a/nixpkgs/pkgs/os-specific/linux/ati-drivers/patches/15.9-sep_printf.patch b/nixpkgs/pkgs/os-specific/linux/ati-drivers/patches/15.9-sep_printf.patch
new file mode 100644
index 000000000000..3e4e8d6499a0
--- /dev/null
+++ b/nixpkgs/pkgs/os-specific/linux/ati-drivers/patches/15.9-sep_printf.patch
@@ -0,0 +1,11 @@
+--- a/common/lib/modules/fglrx/build_mod/firegl_public.c	2015-09-14 15:14:36.000000000 -0400
++++ b/common/lib/modules/fglrx/build_mod/firegl_public.c	2015-09-14 16:18:58.000000000 -0400
+@@ -649,6 +649,8 @@ static int firegl_major_proc_read(struct
+     *eof = 1;
+ 
+     len = snprintf(buf, request, "%d\n", major);
++#elif LINUX_VERSION_CODE >= KERNEL_VERSION(4,3,0)
++    seq_printf(m, "%d\n", major);
+ #else
+     len = seq_printf(m, "%d\n", major);
+ #endif
diff --git a/nixpkgs/pkgs/os-specific/linux/ati-drivers/patches/4.7-arch-cpu_has_pge-v2.patch b/nixpkgs/pkgs/os-specific/linux/ati-drivers/patches/4.7-arch-cpu_has_pge-v2.patch
new file mode 100644
index 000000000000..cb86f5aff276
--- /dev/null
+++ b/nixpkgs/pkgs/os-specific/linux/ati-drivers/patches/4.7-arch-cpu_has_pge-v2.patch
@@ -0,0 +1,70 @@
+diff -uNr 16.8/common/lib/modules/fglrx/build_mod/firegl_public.c 16.8b/common/lib/modules/fglrx/build_mod/firegl_public.c
+--- 16.8/common/lib/modules/fglrx/build_mod/firegl_public.c	2015-12-18 19:47:41.000000000 +0100
++++ 16.8b/common/lib/modules/fglrx/build_mod/firegl_public.c	2016-08-15 15:09:37.228538907 +0200
+@@ -4518,7 +4518,11 @@
+     write_cr0(cr0);
+     wbinvd();
+ 
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,7,0)
++    if (boot_cpu_has(X86_FEATURE_PGE))
++#else
+     if (cpu_has_pge)
++#endif
+     {
+         cr4 = READ_CR4();
+         WRITE_CR4(cr4 & ~X86_CR4_PGE);
+@@ -4532,7 +4536,11 @@
+     wbinvd();
+     __flush_tlb();
+     write_cr0(cr0 & 0xbfffffff);
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,7,0)
++    if (boot_cpu_has(X86_FEATURE_PGE))
++#else
+     if (cpu_has_pge)
++#endif
+     {
+         WRITE_CR4(cr4);
+     }
+@@ -4559,7 +4567,11 @@
+     write_cr0(cr0);
+     wbinvd();
+ 
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,7,0)
++    if (boot_cpu_has(X86_FEATURE_PGE))
++#else
+     if (cpu_has_pge)
++#endif
+     {
+         cr4 = READ_CR4();
+         WRITE_CR4(cr4 & ~X86_CR4_PGE);
+@@ -4572,7 +4584,11 @@
+     wbinvd();
+     __flush_tlb();
+     write_cr0(cr0 & 0xbfffffff);
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,7,0)
++    if (boot_cpu_has(X86_FEATURE_PGE))
++#else
+     if (cpu_has_pge)
++#endif
+     {
+         WRITE_CR4(cr4);
+     }
+diff -uNr 16.8/common/lib/modules/fglrx/build_mod/firegl_public.h 16.8b/common/lib/modules/fglrx/build_mod/firegl_public.h
+--- 16.8/common/lib/modules/fglrx/build_mod/firegl_public.h	2015-12-18 19:47:41.000000000 +0100
++++ 16.8b/common/lib/modules/fglrx/build_mod/firegl_public.h	2016-08-15 15:09:05.815141238 +0200
+@@ -650,9 +650,15 @@
+ #define cpu_has_pat  test_bit(X86_FEATURE_PAT, (void *) &boot_cpu_data.x86_capability)
+ #endif
+ 
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,7,0)
++#ifndef boot_cpu_has(X86_FEATURE_PGE)
++#define boot_cpu_has(X86_FEATURE_PGE) test_bit(X86_FEATURE_PGE, &boot_cpu_data.x86_capability)
++#endif
++#else
+ #ifndef cpu_has_pge
+ #define cpu_has_pge test_bit(X86_FEATURE_PGE, &boot_cpu_data.x86_capability)
+ #endif
++#endif
+ 
+ /* 2.6.29 defines pgprot_writecombine as a macro which resolves to a
+  * GPL-only function with the same name. So we always use our own
diff --git a/nixpkgs/pkgs/os-specific/linux/ati-drivers/patches/4.9-get_user_pages.patch b/nixpkgs/pkgs/os-specific/linux/ati-drivers/patches/4.9-get_user_pages.patch
new file mode 100644
index 000000000000..8a6c42cdb1fc
--- /dev/null
+++ b/nixpkgs/pkgs/os-specific/linux/ati-drivers/patches/4.9-get_user_pages.patch
@@ -0,0 +1,28 @@
+commit b3e4353fc68a6a024dcb95e2d61aa0afd7370233
+Author: Matt McHenry <matt@mchenryfamily.org>
+Date:   Fri Feb 3 20:19:41 2017
+
+    patch for 4.9 only
+
+diff --git a/common/lib/modules/fglrx/build_mod/firegl_public.c b/common/lib/modules/fglrx/build_mod/firegl_public.c
+index 4ce095f..3b591e1 100755
+--- a/common/lib/modules/fglrx/build_mod/firegl_public.c
++++ b/common/lib/modules/fglrx/build_mod/firegl_public.c
+@@ -3224,7 +3224,7 @@ int ATI_API_CALL KCL_LockUserPages(unsigned long vaddr, unsigned long* page_list
+     int ret;
+ 
+     down_read(&current->mm->mmap_sem);
+-    ret = get_user_pages(vaddr, page_cnt, 1, 0, (struct page **)page_list, NULL);
++    ret = get_user_pages(vaddr, page_cnt, 1, (struct page **)page_list, NULL);
+     up_read(&current->mm->mmap_sem);
+ 
+     return ret;
+@@ -3242,7 +3242,7 @@ int ATI_API_CALL KCL_LockReadOnlyUserPages(unsigned long vaddr, unsigned long* p
+     int ret;
+ 
+     down_read(&current->mm->mmap_sem);
+-    ret = get_user_pages(vaddr, page_cnt, 0, 0, (struct page **)page_list, NULL);
++    ret = get_user_pages(vaddr, page_cnt, 0, (struct page **)page_list, NULL);
+     up_read(&current->mm->mmap_sem);
+ 
+     return ret;
diff --git a/nixpkgs/pkgs/os-specific/linux/ati-drivers/patches/kernel-4.6-get_user_pages.patch b/nixpkgs/pkgs/os-specific/linux/ati-drivers/patches/kernel-4.6-get_user_pages.patch
new file mode 100644
index 000000000000..1e7209ed5ed1
--- /dev/null
+++ b/nixpkgs/pkgs/os-specific/linux/ati-drivers/patches/kernel-4.6-get_user_pages.patch
@@ -0,0 +1,25 @@
+diff --git a/common/lib/modules/fglrx/build_mod/firegl_public.c b/common/lib/modules/fglrx/build_mod/firegl_public.c
+index 9c70211..b2242af 100755
+--- a/common/lib/modules/fglrx/build_mod/firegl_public.c
++++ b/common/lib/modules/fglrx/build_mod/firegl_public.c
+@@ -3220,7 +3220,7 @@ int ATI_API_CALL KCL_LockUserPages(unsigned long vaddr, unsigned long* page_list
+     int ret;
+ 
+     down_read(&current->mm->mmap_sem);
+-    ret = get_user_pages(current, current->mm, vaddr, page_cnt, 1, 0, (struct page **)page_list, NULL);
++    ret = get_user_pages(vaddr, page_cnt, 1, 0, (struct page **)page_list, NULL);
+     up_read(&current->mm->mmap_sem);
+ 
+     return ret;
+@@ -3238,7 +3238,7 @@ int ATI_API_CALL KCL_LockReadOnlyUserPages(unsigned long vaddr, unsigned long* p
+     int ret;
+ 
+     down_read(&current->mm->mmap_sem);
+-    ret = get_user_pages(current, current->mm, vaddr, page_cnt, 0, 0, (struct page **)page_list, NULL);
++    ret = get_user_pages(vaddr, page_cnt, 0, 0, (struct page **)page_list, NULL);
+     up_read(&current->mm->mmap_sem);
+ 
+     return ret;
+-- 
+2.9.2
+
diff --git a/nixpkgs/pkgs/os-specific/linux/ati-drivers/patches/kernel-4.6-page_cache_release-put_page.patch b/nixpkgs/pkgs/os-specific/linux/ati-drivers/patches/kernel-4.6-page_cache_release-put_page.patch
new file mode 100644
index 000000000000..28820790e492
--- /dev/null
+++ b/nixpkgs/pkgs/os-specific/linux/ati-drivers/patches/kernel-4.6-page_cache_release-put_page.patch
@@ -0,0 +1,16 @@
+diff --git a/common/lib/modules/fglrx/build_mod/firegl_public.c b/common/lib/modules/fglrx/build_mod/firegl_public.c
+index b2242af..586129c 100755
+--- a/common/lib/modules/fglrx/build_mod/firegl_public.c
++++ b/common/lib/modules/fglrx/build_mod/firegl_public.c
+@@ -3249,7 +3249,7 @@ void ATI_API_CALL KCL_UnlockUserPages(unsigned long* page_list, unsigned int pag
+     unsigned int i;
+     for (i=0; i<page_cnt; i++)
+     {
+-        page_cache_release((struct page*)page_list[i]);
++        put_page((struct page*)page_list[i]);
+     }
+ }
+ 
+-- 
+2.9.2
+
diff --git a/nixpkgs/pkgs/os-specific/linux/ati-drivers/patches/patch-samples.patch b/nixpkgs/pkgs/os-specific/linux/ati-drivers/patches/patch-samples.patch
new file mode 100644
index 000000000000..8bd24b1d022b
--- /dev/null
+++ b/nixpkgs/pkgs/os-specific/linux/ati-drivers/patches/patch-samples.patch
@@ -0,0 +1,26 @@
+diff --git a/samples/fgl_glxgears/fgl_glxgears.c b/samples/fgl_glxgears/fgl_glxgears.c
+index 6c8e313..2b8d035 100644
+--- a/samples/fgl_glxgears/fgl_glxgears.c
++++ b/samples/fgl_glxgears/fgl_glxgears.c
+@@ -1096,8 +1096,6 @@ static void event_loop(void)
+                   view_rotx -= 5.0;
+                }
+                else {
+-                  r = XLookupString(&event.xkey, buffer, sizeof(buffer),
+-                                    NULL, NULL);
+                   if (buffer[0] == 27) {
+                      /* escape */
+                      return;
+
+
+diff -Nur a/samples/fgl_glxgears/fgl_glxgears.c b/samples/fgl_glxgears/fgl_glxgears.c
+--- a/samples/fgl_glxgears/fgl_glxgears.c	2012-08-29 09:59:03.000000000 +0300
++++ b/samples/fgl_glxgears/fgl_glxgears.c	2013-09-07 09:26:11.034723135 +0300
+@@ -78,7 +78,6 @@
+ #endif // _WIN32
+ 
+ #define INT_PTR ptrdiff_t
+-#include <GL/glATI.h>
+ 
+ #ifdef _WIN32
+ #include <GL/wglATI.h>