Last updated 2008-11-05
为了尝试git的intel X driver驱动,需要搭建整个最新的X源码编译环境。主要是因为intel最新的X driver需要支持dixPrive*系列函数,这些函数在xorg-server1.5才有──其实在1.4与1.5的过渡版本中添加的,具体哪个版本没去深究。在他们的主页上说1.3.1以上的X Server就能编译,实际上因为代码更新快的原因,很多文档不可靠了。
本文基于的系统是ArchLinux 2008.3。顺便说一下我对选择发行版的想法:我是有偏好的,但一切以合适为好。ArchLinux适合我的本本使用,主要是它的软件版本新,为了接触最新的X代码,进行测试和开发,我越发感觉到自己的选择是正确的。Slk虽然是我的主要入门版本,最近软件版本采用的也较新,但也许会因要更新某些软件,需要自己去下包,即使有非官方的在线更新工具,也不牢靠。git的X代码中libxcb库需要python2.5才能编译成功,其实Slk12.1是能支持的。genoo由于太费硬盘,在我台式机上用。
于是基于xorg wiki的git方法,使用改进后的shell脚本(蓝色部分为我的修改)建立环境:
#!/bin/sh
PREFIX="/opt/gfx-test"
PKG_CONFIG_PATH=/opt/gfx-test/lib/pkgconfig
MAKE="make -j3"
REPOS="\ git://git.freedesktop.org/git/xorg/util/macros \ git://git.freedesktop.org/git/xorg/proto/x11proto \ git://git.freedesktop.org/git/xorg/proto/damageproto \ git://git.freedesktop.org/git/xorg/proto/xextproto \ git://git.freedesktop.org/git/xorg/proto/fontsproto \ git://git.freedesktop.org/git/xorg/proto/videoproto \ git://git.freedesktop.org/git/xorg/proto/renderproto \ git://git.freedesktop.org/git/xorg/proto/inputproto \ git://git.freedesktop.org/git/xorg/proto/xf86vidmodeproto \ git://git.freedesktop.org/git/xorg/proto/xf86dgaproto \ git://git.freedesktop.org/git/xorg/proto/xf86driproto \ git://git.freedesktop.org/git/xorg/proto/xcmiscproto \ git://git.freedesktop.org/git/xorg/proto/scrnsaverproto \ git://git.freedesktop.org/git/xorg/proto/bigreqsproto \ git://git.freedesktop.org/git/xorg/proto/resourceproto \ git://git.freedesktop.org/git/xorg/proto/compositeproto \ git://git.freedesktop.org/git/xorg/proto/fixesproto \ git://git.freedesktop.org/git/xorg/proto/evieproto \ git://git.freedesktop.org/git/xorg/proto/kbproto \ git://git.freedesktop.org/git/xorg/lib/libxtrans \ git://git.freedesktop.org/git/xorg/lib/libX11 \ git://git.freedesktop.org/git/xorg/lib/libXext \ git://git.freedesktop.org/git/xorg/lib/libxkbfile \ git://git.freedesktop.org/git/xorg/lib/libfontenc \ git://git.freedesktop.org/git/xorg/lib/libXfont \ git://git.freedesktop.org/git/xorg/lib/libXfixes \ git://git.freedesktop.org/git/xorg/lib/libXdamage \ git://git.freedesktop.org/git/xorg/lib/libXv \ git://git.freedesktop.org/git/xorg/lib/libXvMC \ git://git.freedesktop.org/git/xorg/lib/libXxf86vm \ git://git.freedesktop.org/git/xorg/lib/libXinerama \ git://git.freedesktop.org/git/xorg/proto/dri2proto \ git://git.freedesktop.org/git/xorg/proto/glproto \ git://git.freedesktop.org/git/xorg/lib/libpciaccess \ git://git.freedesktop.org/git/pixman \ git://git.freedesktop.org/git/xcb/proto \ git://git.freedesktop.org/git/xcb/pthread-stubs \ git://git.freedesktop.org/git/xcb/libxcb \ git://git.freedesktop.org/git/xorg/proto/randrproto \ git://git.freedesktop.org/git/mesa/drm \ git://git.freedesktop.org/git/mesa/mesa \ git://git.freedesktop.org/git/xorg/xserver \ git://git.freedesktop.org/git/xorg/driver/xf86-input-mouse \ git://git.freedesktop.org/git/xorg/driver/xf86-input-keyboard \ git://git.freedesktop.org/git/xorg/driver/xf86-input-synaptics \ git://git.freedesktop.org/git/xorg/driver/xf86-video-intel"
modules="\ fontsproto \ x11proto \ xextproto \ videoproto \ renderproto \ inputproto \ damageproto \ xf86vidmodeproto \ xf86dgaproto \ xf86driproto \ xcmiscproto \ scrnsaverproto \ bigreqsproto \ resourceproto \ compositeproto \ resourceproto \ evieproto \ kbproto \ fixesproto \ libxtrans \ proto \ pthread-stubs \ libxcb \ libX11 \ libXext \ libxkbfile \ libfontenc \ libXfont \ libXv \ libXvMC \ libXxf86vm \ libXinerama \ libXfixes \ libXdamage \ dri2proto \ glproto \ libpciaccess \ pixman \ randrproto"
spec_modules="\ drm \ mesa \ xserver \ xf86-video-intel"
init() { for repo in $REPOS; do echo "Cloning $repo"; git clone $repo; done cd macros echo "Building macros" ./autogen.sh --prefix="$PREFIX"; ($MAKE); make install cd .. }
update_modules() { for module in $modules; do echo $module cd $module git pull cd .. done
for module in $spec_modules; do echo $module cd $module git pull cd .. done }
build () { export ACLOCAL="aclocal -I$PREFIX/share/aclocal" export PKG_CONFIG_PATH="$PREFIX/lib/pkgconfig" for i in $modules; do cd $i echo ====================== echo configuring $i echo ====================== ./autogen.sh --prefix="$PREFIX"; echo ====================== echo building $i echo ====================== if [ $? -ne 0 ]; then echo "Failed to configure $i." exit fi ($MAKE); make install cd .. done # build drm cd drm ./autogen.sh --prefix="$PREFIX" --enable-udev ($MAKE) make -C linux-core # assuming you're on Linux, otherwise use bsd-core make install cd .. #build mesa cd mesa ./autogen.sh --prefix=$PREFIX --with-driver=dri --disable-glut if [ $? -ne 0 ]; then echo "Failed to configure Mesa." exit fi ($MAKE) make install mkdir -p $PREFIX/bin install -m755 progs/xdemos/{glxinfo,glxgears} $PREFIX/bin/ cd .. #build xserver cd xserver ./autogen.sh --prefix=$PREFIX --enable-builtin-fonts if [ $? -ne 0 ]; then echo "Failed to configure X server." exit fi ($MAKE) make install chown root $PREFIX/bin/Xorg; chmod +s $PREFIX/bin/Xorg cd .. #mouse cd xf86-input-mouse ./autogen.sh --prefix=$PREFIX ($MAKE) make install cd .. #keyboard cd xf86-input-keyboard ./autogen.sh --prefix=$PREFIX ($MAKE) make install cd .. #synaptics cd xf86-input-synaptics ./autogen.sh --prefix=$PREFIX ($MAKE) make install cd .. #build intel video cd xf86-video-intel ./autogen.sh --prefix=$PREFIX ($MAKE) make install cd .. }
case "$1" in init) init ;; build) build ;; update) update_modules ;; *) echo "Usage: $0 init | build | update" exit 3 esac
|
在/opt/gfx-test目录下建立git-src目录,进入目录,把上面的内容保存为xgit.sh文件。chmod +x, 运行:
./xgit.sh init
git clone代码;
完成后,运行:
./xgit.sh build
进行编译。
测试:
rmmod i915 #I just use Intel rmmod drm insmod /linux-core/drm.ko insmod /linux-core/i915.ko export LD_LIBRARY_PATH=/opt/gfx-test/lib startx -- /opt/gfx-test/bin/Xorg -verbose # make sure you have a ~/.xinitrc with what you want to run
|
基本上是copy xorg wiki上的操作。
可实际中,理论总是与实践有差别的。
最新的intel X driver中,内存管理采用GEM而不是以前的TTM,所以对默认的没打patch内核,不会把i915的内核模块编译出来。
drm目录中linux-core内,看Makefile可以发现:
ifeq ($(OS_HAS_GEM), 1) CONFIG_DRM_I915 := m endif |
所以编译i915.ko的正确方法是:
#make -C linux-core OS_HAS_GEM=1
|
结果提示:
/opt/gfx-test/git-src/drm/linux-core/i915_gem_tiling.c: In function ‘i915_gem_detect_bit_6_swizzle’:
/opt/gfx-test/git-src/drm/linux-core/i915_gem_tiling.c:118: error: implicit declaration of function ‘pci_read_base’
make[2]: *** [/opt/gfx-test/git-src/drm/linux-core/i915_gem_tiling.o] Error 1
make[1]: *** [_module_/opt/gfx-test/git-src/drm/linux-core] Error 2
这是因为目前main line内核还不包含GEM patch,pci_read_base函数是PCI patch其中一部分,
在参考链接4中(参考链接2推供的链接上的patch有符号格式问题,
直接从网页copy下来的patch不能使用,lkml.org上的就没问题)。
所以需要寻找包含GEM patch的内核。
#git clone git://people.freedesktop.org/~anholt/linux-2.6 drm-gem-merge #cd drm-gem-merge #git branch -r origin/HEAD origin/drm-gem origin/drm-gem-fd-17085 origin/drm-gem-merge origin/i915-cleanup origin/intel-agp-i965 origin/master origin/origin #git checkout origin/drm-gem-merge
//更新PCI patch #git checkout -b drm-gem-merge origin/drm-gem-merge #git pull #patch -p1
|
参考链接2的做法在ArchLinux下不再有效,我跟着它绕过弯路:-(
可能是git版本导致,要好好看看git的使用方法了。
下面就是普通的编译内核过程,注意DRM选i915就行。drm支持直接编译进内核。
可见Anholt的drm-gem分支与drm目前的git版本有区别。可以尝试用drm-gem-merge内核的来跑
git的X,但是失败的可能性很大。实践证明,这是可行的!刚试了一下,更换vmlinuz26-gem内核启动。
命令如下:
#export LD_LIBRARY_PATH=/opt/gfx-test/lib #startx -- /opt/gfx-test/bin/Xorg -verbose |
测试了一把glxgear,只跑了:3 frames in 6.0 seconds = 0.497FPS。(:-()
现在release的驱动:3402 frames in 5.0 seconds = 680.387 FPS。
内核中的intelfb驱动不可用,LCD屏幕显示不出图像,只能用vesafb。
再次编译git版本drm目录中的i915模块。
#make -C linux-core/ OS_HAS_GEM=1 LINUXDIR=/usr/src/drm-gem-merge/ make: Entering directory `/opt/gfx-test/git-src/drm/linux-core' make -C /usr/src/drm-gem-merge/ SUBDIRS=`/bin/pwd` DRMSRCDIR=`/bin/pwd` modules make[1]: Entering directory `/usr/src/drm-gem-merge' CC [M] /opt/gfx-test/git-src/drm/linux-core/i915_gem_tiling.o /opt/gfx-test/git-src/drm/linux-core/i915_gem_tiling.c: In function ‘i915_gem_detect_bit_6_swizzle’: /opt/gfx-test/git-src/drm/linux-core/i915_gem_tiling.c:118: error: too few arguments to function ‘pci_read_base’ make[2]: *** [/opt/gfx-test/git-src/drm/linux-core/i915_gem_tiling.o] Error 1 make[1]: *** [_module_/opt/gfx-test/git-src/drm/linux-core] Error 2 make[1]: Leaving directory `/usr/src/drm-gem-merge' make: *** [modules] Error 2 make: Leaving directory `/opt/gfx-test/git-src/drm/linux-core'
|
发现当前最新的drm模块中的
linux-core/i915_gem_tiling.c文件中pci_read_base的参数与patch中的对不上…… (汗一个,看来Anholt的gem内核树与drm的git代码不兼容,大牛在搞自己的drm分支)
根据参考链接5,进行了patch,发现还有别的error。
仔细看看日期,这个patch是8-1发布的,而在Anholt的drm-gem-merge分支中,并没有相应处理。
还是学习的做法,用drm-gem-merge的drm吧,那是2008-08-28才加入的GEM for i915的
支持。上面用Anholt的内核启动X git版本了。
到此,基于Intel X3100显卡的X git测试环境已经建立成功。
Anholt的Linux内核git更新:
git clone git://git.kernel.org/pub/scm/linux/kernel/git/anholt/drm-intel |
gem的内核支持,进入mainline了,2.6.28应该会release.
参考链接:
1.
2.
3.
4.
5. http://thread.gmane.org/gmane.linux.kernel/715029/focus=715030
阅读(1764) | 评论(1) | 转发(0) |