Chinaunix首页 | 论坛 | 博客
  • 博客访问: 242810
  • 博文数量: 72
  • 博客积分: 2592
  • 博客等级: 少校
  • 技术积分: 834
  • 用 户 组: 普通用户
  • 注册时间: 2005-04-28 00:16
文章分类

全部博文(72)

文章存档

2014年(1)

2012年(1)

2011年(6)

2010年(12)

2009年(19)

2008年(28)

2007年(4)

2005年(1)

我的朋友

分类: LINUX

2008-09-27 21:23:24

                     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
进行编译。

测试:
 
  1. rmmod i915    #I just use Intel

  2. rmmod drm

  3. insmod /linux-core/drm.ko

  4. insmod /linux-core/i915.ko

  5. export LD_LIBRARY_PATH=/opt/gfx-test/lib

  6. 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



阅读(1757) | 评论(1) | 转发(0) |
0

上一篇:普陀3日游

下一篇:[Note]ZFS on Linux

给主人留下些什么吧!~~

chinaunix网友2008-10-13 08:45:46

Hi, Sorry that I can't type Chinese, but I can read it. I also tried to make my intel graphics driver work on linux. And after reading your blog, I compiled Anholt's drm-gem-merge version of kernel following your instruction. And I tried to start git x with this new kernel but got no success. Since the git-drm version compilation will still get error, how did you worked around this? Thanks in advance!