criticablog

ソフトウェアエンジニアがニッチな情報を書きます。

build fglrx module for linux 3.17 or later

こんばんわ。グラボRadeon 使っています。

2〜3ヶ月前から最新の linux カーネル用に fglrx ドライバをビルドできなくなっていたので、しかたなく linux 3.16 を使っていました。

しかし今回パッチを見つけたのでそれを適用してビルドしました。module-assistant 使う場合にオレオレ パッチをとりあえず差し込めましたが、これでよかったのでしょうか。

一回失敗する

%  module-assistant --text-mode --verbose build fglrx
NOTE: You are not root but member of the src group. Mapping the base
working directory to "/usr/src/modass".
Found sudo, will use it for %s and dpkg commands.unpack
Removing old /usr/src/modass/usr_src/modules/fglrx/ tree
 rm -rf /usr/src/modass/usr_src/modules/fglrx
Extracting the package tarball, /usr/src/fglrx.tar.bz2, please wait...
 tar --bzip2 -x -f /usr/src/fglrx.tar.bz2
tar: modules: Cannot utime: Operation not permitted
tar: modules: Cannot change mode to rwxr-xr-x: Operation not permitted
tar: Exiting with failure status due to previous errors
"/usr/share/modass/packages/default.sh" build KVERS=3.17.0-trunk-amd64 KSRC=/lib/modules/3.17.0-trunk-amd64/build KDREV=3.17.4-1~exp1 kdist_image
 fakeroot debian/rules kdist_clean
/usr/bin/make  -f debian/rules clean
make[1]: Entering directory '/usr/src/modass/usr_src/modules/fglrx'
test -f debian/control || cp debian/control.template debian/control
dh_testroot
rm -f configure-stamp
rm -f fglrx.ko fglrx.mod.c *.o
rm -f .version .*.o.flags .*.o.d .*.o.cmd .*.ko.cmd
rm -rf .tmp_versions
rm -rf patch
dh_clean debian/control debian/install
make[1]: Leaving directory '/usr/src/modass/usr_src/modules/fglrx'
 fakeroot debian/rules KVERS=3.17.0-trunk-amd64 KSRC=/lib/modules/3.17.0-trunk-amd64/build KDREV=3.17.4-1~exp1 kdist_image
/usr/bin/make  -f debian/rules binary_modules
make[1]: Entering directory '/usr/src/modass/usr_src/modules/fglrx'
sed -e 's/#KVERS#/3.17.0-trunk-amd64/g' \
    -e 's/#VERSION#/1:14.9+ga14.201-2/g' debian/control.template > debian/control
sed 's/#KVERS#/3.17.0-trunk-amd64/g' debian/install.template > debian/install
touch configure-stamp
dh_testdir
dh_prep
/usr/bin/make -C /lib/modules/3.17.0-trunk-amd64/build SUBDIRS=/usr/src/modass/usr_src/modules/fglrx modules
make[2]: Entering directory '/usr/src/linux-headers-3.17.0-trunk-amd64'
Makefile:10: *** mixed implicit and normal rules: deprecated syntax
make[1]: Entering directory `/usr/src/linux-headers-3.17.0-trunk-amd64'
  CC [M]  /usr/src/modass/usr_src/modules/fglrx/firegl_public.o
/usr/src/modass/usr_src/modules/fglrx/firegl_public.c:6387:12: warning: ‘KCL_fpu_save_init’ defined but not used [-Wunused-function]
 static int KCL_fpu_save_init(struct task_struct *tsk)
            ^
  CC [M]  /usr/src/modass/usr_src/modules/fglrx/kcl_acpi.o
/usr/src/modass/usr_src/modules/fglrx/kcl_acpi.c: In function ‘KCL_ACPI_Slot_No_Hotplug’:
/usr/src/modass/usr_src/modules/fglrx/kcl_acpi.c:845:21: error: ‘struct acpi_device_flags’ has no member named ‘no_hotplug’
          tdev->flags.no_hotplug = true;
                     ^
/usr/src/linux-headers-3.17.0-trunk-common/scripts/Makefile.build:262: recipe for target '/usr/src/modass/usr_src/modules/fglrx/kcl_acpi.o' failed
make[5]: *** [/usr/src/modass/usr_src/modules/fglrx/kcl_acpi.o] Error 1
/usr/src/linux-headers-3.17.0-trunk-common/Makefile:1390: recipe for target '_module_/usr/src/modass/usr_src/modules/fglrx' failed
make[4]: *** [_module_/usr/src/modass/usr_src/modules/fglrx] Error 2
Makefile:181: recipe for target 'sub-make' failed
make[3]: *** [sub-make] Error 2
Makefile:8: recipe for target 'all' failed
make[2]: *** [all] Error 2
make[2]: Leaving directory '/usr/src/linux-headers-3.17.0-trunk-amd64'
debian/rules:53: recipe for target 'build' failed
make[1]: *** [build] Error 2
make[1]: Leaving directory '/usr/src/modass/usr_src/modules/fglrx'
debian/rules:109: recipe for target 'kdist_image' failed
make: *** [kdist_image] Error 2
BUILD FAILED!
See /usr/src/modass/var_cache_modass/fglrx-source.buildlog.3.17.0-trunk-amd64.1419839576 for details.
Build failed. Press Return to continue...

エンター押しといてください

パッチを拾う

fglrx linux 3.17 と検索して見つけたのが https://gist.github.com/aginor/4f232d4c28aef7685282 です。なるほど no_hotplug の代わりに別のところに ignore_hotplug ができたんですね。

% cd /usr/src/modass/usr_src/modules/fglrx
% curl -O https://gist.githubusercontent.com/aginor/4f232d4c28aef7685282/raw/c7958e092fa19b4e2603e9bd377aca89569d77fb/AMD-fglrx-3.17.patch

debian/rules を修正

build ルールの $(MAKE) 直前あたりが適当そうです。さっきの .patch で目当てのコードが書き換わるよう、こう修正してみましょう:

build: configure-stamp
    dh_testdir
    dh_prep
    patch kcl_acpi.c AMD-fglrx-3.17.patch
    $(MAKE) -C $(KSRC) SUBDIRS=$(CURDIR) modules

いつもの patch -p0 < ○.patch の書き方だとどのファイルにパッチあてるかファイル名聞かれちゃいます。

ビルド

%  fakeroot debian/rules KVERS=3.17.0-trunk-amd64 KSRC=/lib/modules/3.17.0-trunk-amd64/build KDREV=3.17.4-1~exp1 kdist_image
/usr/bin/make  -f debian/rules binary_modules
make[1]: Entering directory '/usr/src/modass/usr_src/modules/fglrx'
dh_testdir
dh_prep
patch kcl_acpi.c AMD-fglrx-3.17.patch
patching file kcl_acpi.c
/usr/bin/make -C /lib/modules/3.17.0-trunk-amd64/build SUBDIRS=/usr/src/modass/usr_src/modules/fglrx modules
make[2]: Entering directory '/usr/src/linux-headers-3.17.0-trunk-amd64'
Makefile:10: *** mixed implicit and normal rules: deprecated syntax
make[1]: Entering directory `/usr/src/linux-headers-3.17.0-trunk-amd64'
  CC [M]  /usr/src/modass/usr_src/modules/fglrx/kcl_acpi.o
  CC [M]  /usr/src/modass/usr_src/modules/fglrx/kcl_agp.o
  CC [M]  /usr/src/modass/usr_src/modules/fglrx/kcl_debug.o
  CC [M]  /usr/src/modass/usr_src/modules/fglrx/kcl_ioctl.o
  CC [M]  /usr/src/modass/usr_src/modules/fglrx/kcl_io.o
  CC [M]  /usr/src/modass/usr_src/modules/fglrx/kcl_pci.o
  CC [M]  /usr/src/modass/usr_src/modules/fglrx/kcl_str.o
  CC [M]  /usr/src/modass/usr_src/modules/fglrx/kcl_iommu.o
  CC [M]  /usr/src/modass/usr_src/modules/fglrx/kcl.o
  CC [M]  /usr/src/modass/usr_src/modules/fglrx/kcl_wait.o
  LD [M]  /usr/src/modass/usr_src/modules/fglrx/fglrx.o
  Building modules, stage 2.
  MODPOST 1 modules
  CC      /usr/src/modass/usr_src/modules/fglrx/fglrx.mod.o
  LD [M]  /usr/src/modass/usr_src/modules/fglrx/fglrx.ko
make[2]: Leaving directory '/usr/src/linux-headers-3.17.0-trunk-amd64'
dh_testdir
dh_testroot
dh_installdirs
dh_install
dh_installdocs
dh_installchangelogs
dh_installmodules
dh_bugfiles
dh_lintian
dh_link
dh_strip
dh_compress
dh_fixperms
dh_installdeb
dh_gencontrol -- -v1:14.9+ga14.201-2+3.17.4-1~exp1 \
        -V'fglrx:Version=14.9+ga14.201' \
        -V'built:using:kernel=linux (=3.17.4-1~exp1)' \
        -V'built:using:fglrx=fglrx-driver (=1:14.9+ga14.201-2)'
dpkg-gencontrol: warning: File::FcntlLock not available; using flock which is not NFS-safe
dh_md5sums
dh_builddeb --destdir=/usr/src/modass/usr_src/modules/fglrx/../..
dpkg-deb: building package `fglrx-kernel-3.17.0-trunk-amd64' in `/usr/src/modass/usr_src/modules/fglrx/../../fglrx-kernel-3.17.0-trunk-amd64_14.9+ga14.201-2+3.17.4-1~exp1_amd64.deb'.
make[1]: Leaving directory '/usr/src/modass/usr_src/modules/fglrx'

お、パッケージできました。なるほど。

%  ls -l ../../
total 2184
-rw-r--r--  1 yosi src 2217200 Dec 29 17:15 fglrx-kernel-3.17.0-trunk-amd64_14.9+ga14.201-2+3.17.4-1~exp1_amd64.deb

インストール

dpkg -i 使うなりそれぞれのやり方でインストールしてください。 うちは全部 apt-get(aptitude) で把握したいのでローカルリポジトリに配置します。詳細は省略します。

% mv ../../fglrx-kernel-3.17.0-trunk-amd64_14.9+ga14.201-2+3.17.4-1\~exp1_amd64.deb /var/cache/apt-build/repository 
# apt-build build-repository && aptitude update; aptitude install fglrx-kernel-3.17.0-trunk-amd64

Xorg 再起動

OS再起動してもいいけど。

# modprobe fglrx
# sleep 60 && service kdm stop && sleep 60 && service kdm start

それではこれから確かめてみます。