ATI (简体中文)
ATI/AMD显卡用户有两个选择:官方的专有驱动(catalystAUR)和开源驱动(xf86-video-ati)。本文介绍开源驱动.
目前,开源驱动在新显卡的 3D 性能上不及官方专属版本,也缺乏TV输出等功能。但另一方面,它能更好地支持双显示,优秀的2D加速,为基于 OpenGL 的窗口管理器如 Mutter, KWin 或 Compiz 提供了足够的 3D 加速。
如果你不确定该用哪种,请先试一试开源版的。开源驱动能满足大多数的需要,而且,一般来说遇到的麻烦也更少些。查看现在功能开发进展情况可访问 功能矩阵。
Contents
- 1 命名规范
- 2 概览
- 3 安装
- 4 配置
- 5 载入
- 6 性能调整
- 7 混合交火
- 8 节能
- 9 TV输出(TV out)
- 10 HDMI 音频输出
- 11 Dual Head setup
- 12 启动视频加速
- 13 关闭垂直同步刷新
-
14 故障排除
- 14.1 登录后出现Artifacts
- 14.2 添加没有被侦测到的分辨率
- 14.3 AGP被禁用(KMS启用)
- 14.4 电视屏幕显示黑边
- 14.5 从睡眠恢复后X显示一个黑屏,鼠标指针还在
- 14.6 X1300上KDE4没有桌面特效
- 14.7 KMS启用时,黑幕,没有控制台,但是 X 能够工作
- 14.8 2D 性能(比如滚动滑块)缓慢
- 14.9 显示器旋转对光标起效却对窗口/内容不起效
- 14.10 在ATI X1600 (RV530 series)上3D应用程序显示黑窗口
- 14.11 从休眠中唤醒后光标崩溃
- 14.12 多显示器模式下DisplayPort黑屏
- 14.13 Gallium HUD
命名规范
Radeon品牌遵循这样的命名规则:每个产品关联与某个市场分段.这篇文章中读者将会见到产品名(比如 HD 4850, X1900)与代码或者核心名(比如 RV770, R580). 传统地, 一个产品系列将匹配一个核心系列 (比如产品系列 "X1000" 包含 X1300, X1600, X1800, 和 X1900 ,他们的核心系列是"R500" – 包含 RV515, RV530, R520, 和 R580 核心).
具体对应关系可以查看维基百科: Wikipedia:Comparison of AMD graphics processing units.
概览
xf86-video-ati
(radeon) 驱动:
- 支持至 Radeon HD 6xxx 和 7xxxM 显卡系列(“北方群岛” 系列显卡)。
- HD 77xx (南方群岛系列)已大部分支持.查看功能矩阵以了解不受支持的功能.
- Radeons X1xxx 以及之前的显卡系列,拥有稳定、完整的功能以及2D、3D加速功能。
- Radeons HD 2xxx 到 HD 6xxx系列具备完整2D加速和较好的3D加速功能,但相比ati官方驱动,功能仍然不全(比如, powersaving仍然处于测试阶段)。
- 支持 DRI1, RandR 1.2/1.3/1.4, Glamor, EXA 加速 和 kernel mode-setting/DRI2.
一般来说,xf86-video-ati 应该是是你的首选,无论你用什么ATI/AMD卡。当然如果你使用的是最新的AMD显卡,你可能更喜欢 catalyst 驱动。
安装
安装软件包xf86-video-ati.它为2D加速提供DDX驱动,而作为其依赖的mesa提供DRI支持和3D加速.(It provides the DDX driver for 2D acceleration and it pulls in mesa as a dependency, providing the DRI driver for 3D acceleration.)
为了获得OpenGL支持,还需安装 mesa-libgl。若需要x86_64下的32位支持,可以从multilib安装lib32-mesa-libgl.
加速视频解码 由 mesa-vdpau 和 lib32-mesa-vdpau 包提供支持。
配置
Xorg 会自动装入驱动并通过 EDID 获得显示器分辨率,只有性能优化时才需要额外配置。
如果要手动配置,请添加文件 /etc/X11/xorg.conf.d/20-radeon.conf
, 并加入:
Section "Device" Identifier "Radeon" Driver "radeon" EndSection
通过此段可以调整显卡的设置。
载入
radeon模块应该在启动时被正常载入.
要是没有的话...
- 确保 内核参数 中没有
nomodeset
或vga=
,因为现在 radeon 需要 KMS. - 另外,检查
/etc/modprobe.d/
或/usr/lib/modprobe.d/
以确保radeon模块没有被禁用.
早启动KMS
radeon支持(并且现在强制需要)Kernel Mode Setting(KMS).KMS默认启用.
KMS一般在载入initramfs后初始化.不过,也可以在载入initramfs时启用KMS:将 radeon
模块添加到 /etc/mkinitcpio.conf
的 MODULES
列:
MODULES="... radeon ..."
重生成initramfs:
# mkinitcpio -p linux
下次重启生效.
性能调整
下面这些选项属于/etc/X11/xorg.conf.d/20-radeon.conf
.
ColorTiling 是绝对安全的,并且默认被启用. 大多数用户能注意到性能的提升,但是这个功能R200及更早的显卡不支持. 早的显卡虽可以启用,但是工作负担转移到了cpu上
Option "ColorTiling" "on"
Acceleration architecture; Glamor是一种使用OpenGL的 2D加速方式,适用于R300及以上显卡驱动。 自xf86-video-ati版本1:7.2.0-1后, 在radeonsi(南方群岛系列 和 superior GFX 显卡)上glamor默认启用; 在其他显卡上想启用的话,添加 AccelMethod glamor 到配置文件:
Option "AccelMethod" "Glamor"
Page Flip 一般来说是安全的. 老显卡可以启用这个功能,不过这样将会禁用EXA. 最近的驱动可以使这项功能和EXA都启用.
Option "EnablePageFlip" "on"
EXAVSync 选项试图通过stalling the engine until the display controller has passed the destination region来避免撕裂。在开启了Xv overlay视频选项的3D加速桌面非常有用,使用KMS时则没有必要。
Option "EXAVSync" "yes"
下面是一个简单的配置文件示例: /etc/X11/xorg.conf.d/20-radeon.conf
:
Section "Device" Identifier "My Graphics Card" Driver "radeon" Option "SWcursor" "off" #software cursor might be necessary on some rare occasions, hence set off by default Option "AccelMethod" "Glamor" #valid options are XAA, EXA and Glamor. Default value varies per-GPU. #Option "EXAVSync" "off" #default is off, otherwise on. Only works if EXA activated #Option "EXAPixmaps" "on" #when on icreases 2D performance, but may also cause artifacts on some old cards. Only works if EXA activated Option "AccelDFS" "on" #default is off, because it can give problems with some PCI-e/AGP cards (artefacts, corruption, etc.) EndSection
模块参数
应用模块参数前请阅读 man radeon
与 RadeonFeature 。
这些内核参数可能会有用:radeon.bapm=1
[1], radeon.disp_priority=2
[2], radeon.hw_i2c=1
[3], radeon.mst=1
[4], radeon.msi=1
(强制启用 MSI 支持), radeon.audio=0
(强制禁用 GPU 音频) 和/或 radeon.tv=0
(禁用 TV-out).
使用 systool
来调试模块参数,参阅 Kernel_modules#Obtaining_information:
$ systool -v -m radeon
Parameters: agpmode = "0" aspm = "-1" audio = "-1" auxch = "-1" backlight = "-1" bapm = "-1" benchmark = "0" connector_table = "0" deep_color = "0" disp_priority = "0" dpm = "-1" dynclks = "-1" fastfb = "0" hard_reset = "0" hw_i2c = "0" lockup_timeout = "10000" msi = "-1" mst = "0" no_wb = "0" pcie_gen2 = "-1" r4xx_atom = "0" runpm = "-1" test = "0" tv = "1" use_pflipirq = "2" vm_block_size = "12" vm_size = "8"
如果gartsize没有自动检测到,可以通过向内核参数添加radeon.gartsize=32
来实现,单位是Mb,对于RV280显卡是32M。
注意: 对于新的AMD显卡不再需要设置这个参数:
[drm] Detected VRAM RAM=2048M, BAR=256M [drm] radeon: 2048M of VRAM memory ready [drm] radeon: 2048M of GTT memory ready.
关闭 PCI-E 2.0
从3.6版内核开始,radeon里PCI-E v2.0选项默认启用。
对一些主板可能不稳定,可以向内核参数添加 radeon.pcie_gen2=0
来关闭。
参考 Phoronix 文章
混合交火
这是一项通常在配备了双显卡——一块比较节能(比如Intel的核芯显卡),另一块为高性能、高能耗(Radeon或NVIDIA)的笔记本上启用的特性。有两种方法可以启用它:
- 如果不需要运行很吃GPU的程序,可以禁用独立显卡(参见Ubuntu wiki ):
echo OFF > /sys/kernel/debug/vgaswitcheroo/switch
。 - PRIME是在Linux系统中使用双显卡切换的正确方式,但仍然需要用户进行大量手动设置。
节能
开源驱动的节电功能默认关闭,需要可手动启用.
三种方法可供选择:
不好说哪个方法对你最合适,你该自己试试。
详见 http://www.x.org/wiki/RadeonFeature/#index3h2 .
老方法
动态频率调整
此方法根据GPU负载自动改变时钟频率,所以GPU忙碌时显示性能提高,空闲时降低。自动变频试图在垂直消隐期间进行,但由于变频函数可能在周期内无法完成,这种方法可能导致显示闪烁。因此,动态调整只能在单显示器下正常工作。
可以通过以下命令启用:
# echo dynpm > /sys/class/drm/card0/device/power_method
基于计划的频率调整
该方法允许你选择5种不同的计划。主要来说,不同的计划最终都改变GPU时钟频率和电压。这种方式不同于积极方式,但更稳定,少闪屏,而且可用于多显示器环境
要激活此方法,可运行以下命令:
# echo profile > /sys/class/drm/card0/device/power_method
可选的计划:
-
default
使用默认时钟频率,不改变电源状态。这是默认启用的计划。 -
auto
根据系统是否使用电池,在电源状态mid
和high
间自动切换 -
low
强制GPU运行于low
电源状态.注意low
在某些笔记本上可能导致显示问题, 如auto
计划在显示器关闭时只选中low
.(Note thatlow
can cause display problems on some laptops, which is whyauto
only useslow
when monitors are off. ) 在其他计划中,当显示器进入节能状态时,将自动切换为low
计划 -
mid
强制GPU运行于mid
电源状态. -
high
强制GPU运行于high
电源状态.
例如,我们可以激活low
计划(你可以根据需要替换为上述其他计划):
# echo low > /sys/class/drm/card0/device/power_profile
永久配置
上述方法不是永久性的,系统重启后将丢失。为了让它一直有效,你可以使用systemd-tmpfiles (例如 #Dynamic frequency switching):
/etc/tmpfiles.d/radeon-pm.conf
w /sys/class/drm/card0/device/power_method - - - - dynpm
你也可以使用udev规则替代 (例如 #Profile-based frequency switching):
/etc/udev/rules.d/30-radeon-pm.rules
KERNEL=="dri/card0", SUBSYSTEM=="drm", DRIVERS=="radeon", ATTR{device/power_method}="profile", ATTR{device/power_profile}="low"
KERNEL=="card0", SUBSYSTEM=="drm", DRIVERS=="radeon", ATTR{device/power_method}="profile",
图形化工具
- Radeon-tray — 通过状态栏图标控制配置方式的小工具。基于PyQt4编写,适合非gnome桌面的用户。
- power-play-switcher — 控制开源Radeon驱动电源的小工具
- https://code.google.com/p/power-play-switcher/ || power-play-switcherAUR[broken link: archived in aur-mirror]
- Gnome-shell-extension-Radeon-Power-Profile-Manager — gnome-shell扩展,允许你改变开源Radeon驱动的电源配置方式
- https://github.com/StuntsPT/shell-extension-radeon-power-profile-manager || gnome-shell-extension-radeon-ppmAUR[broken link: archived in aur-mirror] gnome-shell-extension-radeon-power-profile-manager-gitAUR[broken link: archived in aur-mirror]
动态电源管理
从3.13内核开始,在很多AMD Radeon设备上DPM默认启用。如果要禁用可加入参数 radeon.dpm=0
到 kernel parameters。
不像dynpm,“dpm"方式根据GPU负载情况动态调整时钟频率和电压,同时它会启用频率和电压门控.
dpm有3种模式可选:
-
battery
最节能 -
balanced
默认 -
performance
最佳性能
可以通过sysfs来更改dpm的模式,如下:
# echo battery > /sys/class/drm/card0/device/power_dpm_state
你也许想要强制显卡工作在某一性能等级下:
-
auto
默认; 使用当前dpm模式限定的所有性能等级 -
low
强制在最低性能 -
high
强制在最高性能
# echo low > /sys/class/drm/card0/device/power_dpm_force_performance_level
其它
要查看当前GPU频率,可以运行如下命令,你可以看到类似如下输出:
# cat /sys/kernel/debug/dri/0/radeon_pm_info
state: PM_STATE_ENABLED default engine clock: 300000 kHz current engine clock: 300720 kHz default memory clock: 200000 kHz
It depends on which GPU line yours is, however. Along with the radeon driver versions, kernel versions, etc. So it may not have much/any voltage regulation at all.
Thermal sensors are implemented via external i2c chips or via the internal thermal sensor (rv6xx-evergreen only). To get the temperature on asics that use i2c chips, you need to load the appropriate hwmon driver for the sensor used on your board (lm63, lm64, etc.). The drm will attempt to load the appropriate hwmon driver. On boards that use the internal thermal sensor, the drm will set up the hwmon interface automatically. When the appropriate driver is loaded, the temperatures can be accessed via lm_sensors tools or via sysfs in /sys/class/hwmon
.
TV输出(TV out)
首先,检查你有S-video输出:xrandr
应该会给你类似如下的结果:
Screen 0: minimum 320x200, current 1024x768, maximum 1280x1200 ... S-video disconnected (normal left inverted right x axis y axis)
现在我们应该告诉Xorg它已经接上了 (本来就是,对吧)
xrandr --output S-video --set "load detection" 1
设定TV制式标准
xrandr --output S-video --set "tv standard" ntsc
为它添加一个分辨率(目前只支持800x600)
xrandr --addmode S-video 800x600
复制模式(clone mode)
xrandr --output S-video --same-as VGA-0
好了,让我们来看看效果吧
xrandr --output S-video --mode 800x600
这时,在电视上你应该能看到你的桌面,分辨率是800x600。
要关掉这一输出:
xrandr --output S-video --off
你可能还发现视频只在显示器上播放,而电视上没有。XV_CRTC属性控制着Xv overlay的输出方向。
把输出指向电视:
xvattr -a XV_CRTC -v 1
要切换回显示器,把1
改成0
。-1
应用于双头显示(dual head)设置中的自动切换。
Please see Enabling TV-Out Statically for how to enable TV-out in your xorg configuration file.
在KMS中强制TV输出
内核可识别下列格式的 video=
参数 (参见KMS):
video=<conn>:<xres>x<yres>[M][R][-<bpp>][@<refresh>][i][m][eDd]
例如:
video=DVI-I-1:1280x1024-24@60e
带有空格的参数必须用引号括起:
"video=9-pin DIN-1:1024x768-24@60e"
Current mkinitcpio implementation also requires #
in front. For example:
root=/dev/disk/by-uuid/d950a14f-fc0c-451d-b0d4-f95c2adefee3 ro quiet radeon.modeset=1 security=none # video=DVI-I-1:1280x1024-24@60e "video=9-pin DIN-1:1024x768-24@60e"
- Grub 可直接接受如上参数。
- Lilo 需要在双引号前使用“\”转义 (例如
# \"video=9-pin DIN-1:1024x768-24@60e\"
) - Grub2: TODO
You can get list of your video outputs with following command:
$ ls -1 /sys/class/drm/ | grep -E '^card[[:digit:]]+-' | cut -d- -f2-
HDMI 音频输出
HDMI音频输出在 xf86-video-ati 软件包中提供支持。由于可能引发一些问题,在 Linux内核版本 >=3.0 中默认禁用了HDMI音频输出。要启用它,在 内核参数 中添加 radeon.audio=1
。
如果启动后没有视频输出,则请禁用这个参数。
Dual Head setup
独立的 X screen
独立的双显示器可以按正常方式配置,radeon 驱动有一个 "ZaphodHeads"
选项可以把显示的区域绑定到固定的设备,例如:
Section "Device" Identifier "Device0" Driver "radeon" Option "ZaphodHeads" "VGA-0" VendorName "ATI" BusID "PCI:1:0:0" Screen 0 EndSection
有些设备有多个输出(HDMI, DVI 和 VGA),但是双屏显示的时候只使用其中的某两个组合例如 HDMI+DVI,所以需要通过 "ZaphodHeads" "VGA-0"
更改输出设备。
启动视频加速
mesa-vdpau 包已为开源驱动带来MPEG1/2的硬件解码支持,安装 libvdpau 后将自动启用。
要是它不会自动使用的话,你也可以通过声明环境变量 LIBVA_DRIVER_NAME
为 vdpau
和 VDPAU_DRIVER
为对应驱动来强制启用,例如:
~/.bashrc
export LIBVA_DRIVER_NAME=vdpau export VDPAU_DRIVER=r600
这用于基于 r600 系列及以上的显卡(所有可用VDPAU 驱动位于 /usr/lib/vdpau/
目录下找到)。
如果你拥有一块南方群岛(HD 7XXX) 或者更高的显卡,VDPAU_DRIVER
变量应该设置成radeonsi
:
~/.bashrc
export VDPAU_DRIVER=radeonsi
使用 vainfo
来验证新设置:
$ vainfo
libva info: VA-API version 0.38.0 libva info: va_getDriverName() returns 0 libva info: User requested driver 'vdpau' libva info: Trying to open /usr/lib/dri/vdpau_drv_video.so libva info: Found init function __vaDriverInit_0_35 libva info: va_openDriver() returns 0 vainfo: VA-API version: 0.38 (libva 1.6.0) vainfo: Driver version: Splitted-Desktop Systems VDPAU backend for VA-API - 0.7.4 vainfo: Supported profile and entrypoints VAProfileMPEG2Simple : VAEntrypointVLD VAProfileMPEG2Main : VAEntrypointVLD VAProfileMPEG4Simple : VAEntrypointVLD VAProfileMPEG4AdvancedSimple : VAEntrypointVLD VAProfileH264Baseline : VAEntrypointVLD VAProfileH264Main : VAEntrypointVLD VAProfileH264High : VAEntrypointVLD VAProfileVC1Advanced : VAEntrypointVLD
关闭垂直同步刷新
radeon驱动默认启用垂直同步刷新,除了跑分外各种情况下工作良好。要关闭它,可以创建 ~/.drirc
(如果已存在请修改),加入以下部分 :
~/.drirc
<driconf> <device screen="0" driver="dri2"> <application name="Default"> <option name="vblank_mode" value="0" /> </application> </device> <!-- Other devices ... --> </driconf>
请确保是 dri2 , 而不是你的显卡型号(如 r600 )。
故障排除
登录后出现Artifacts
如果遇到了artifacts, 先试试不用/etc/X11/xorg.conf
启动X. 最近版本的Xorg有可靠的自动检测/配置能力.过时或者不当的 xorg.conf
会导致问题.
不以配置文件启动时,推荐先安装xorg-input-drivers
软件包组.
你也可以试着禁用 EXAPixmaps
.在/etc/X11/xorg.conf.d/20-radeon.conf
中:
Section "Device" Identifier "Radeon" Driver "radeon" Option "EXAPixmaps" "off" EndSection
若想进一步地调整,还可以禁用 AccelDFS
:
Option "AccelDFS" "off"
添加没有被侦测到的分辨率
参见Xrandr的文章.
AGP被禁用(KMS启用)
如果性能很差,dmesg也有如下信息
[drm:radeon_agp_init] *ERROR* Unable to acquire AGP: -19
那么检查针对你主板的agp驱动(如 via_agp
, intel_agp
等)是否在 radeon
前被加载, 参见 #启用 KMS.
电视屏幕显示黑边
我的Radeon HD 5770用HDMI连接到电视时, 电视显示图像模糊,周围有2-3cm黑边,用催化剂时不是这样. 这是对付过扫描(Overscan)的(参见Wikipedia:Overscan),使用xrandr关闭它:
xrandr --output HDMI-0 --set underscan off
从睡眠恢复后X显示一个黑屏,鼠标指针还在
32MB或者更低的卡可能会有这个问题. 鼠标指针移动过的区域可能会被重绘.在 /etc/X11/xorg.conf.d/20-radeon.conf
中强制EXAPixmaps
为 "enabled"
可能能解决此问题.参见#性能调整 .
X1300上KDE4没有桌面特效
KDE4的一个问题可能使视频硬件检测不准确,因此禁用了桌面特效,即使X1300的GPU有足够的能力. 一个可行的办法是,禁用掉KDE的检测,在/usr/share/kde-settings/kde-profile/default/share/config/kwinrc
和/或 .kde/share/config/kwinrc
中
添加
DisableChecks=true
到 [Compositing] 部分. 确保compositing是启用的:
Enabled=true
KMS启用时,黑幕,没有控制台,但是 X 能够工作
当在同一台PC使用两张或以上的ATI显卡时可能会遇到此问题. 例如 Fujitsu Siemens Amilo PA 3553 笔记本就有这个问题. 这是因为fbcon控制台驱动程序映射自己到已存在于错误的显卡的framebuffer设备上(This is due to fbcon console driver mapping itself to wrong framebuffer device that exist on the wrong card). 在内核参数添加:
fbcon=map:1
这将告诉fbcon映射自己到 /dev/fb1
而不是 /dev/fb0
.如果这并未解决你的问题,尝试如下配置启动:
fbcon=map:0
2D 性能(比如滚动滑块)缓慢
如果2D性能(比如在终端或浏览器的滚动滑块)有问题, 你可以将 Option "MigrationHeuristic" "greedy"
添加到你的 xorg.conf
文件的 Device
部分.
这是一个样例 /etc/X11/xorg.conf.d/20-radeon.conf
:
Section "Device" Identifier "My Graphics Card" Driver "radeon" Option "MigrationHeuristic" "greedy" EndSection
显示器旋转对光标起效却对窗口/内容不起效
启用EXA代替glamor的新显卡用户可能会发现,用xrandr旋转显示器将导致光标和显示器尺寸旋转了,但窗口与里面内容却保持原来方向. 另外移动鼠标时光标按照原来的方向移动.若有此问题,在你的 /var/log/Xorg.0.log
中查找下面这一行:
(EE) RADEON(0): Rotation requires acceleration!
新显卡上使用EXA时加速将被禁用(来源: 这里). 你必须从启用EXA (参见这里) 和旋转中二选一.
在ATI X1600 (RV530 series)上3D应用程序显示黑窗口
这三种方法可能有效:
- 将
pci=nomsi
添加到你的启动器的 内核参数. - 如果没用的话,试试用
noapic
代替pci=nomsi
. - 如果还是没用,你可以试试
vblank_mode=0 glxgears
或者vblank_mode=1 glxgears
,看看哪个对你有用. 然后安装driconf , 在~/.drirc
里设置此参数.
从休眠中唤醒后光标崩溃
如果显示器唤醒后光标垂直方向重复刷新,可以在xorg的配置文件的"Device"部分中将"SWCursor"设置成"true".
多显示器模式下DisplayPort黑屏
尝试以内核参数 radeon.audio=0
启动。
Gallium HUD
radeon 支持激活一个HUD,来显示透明的图像及文字于正在渲染的程序(如游戏)之上。可以显示当前帧率,每个CPU核心负载或者CPU负载平均值。这个HUD受 GALLIUM_HUD 环境变量控制,可以添加一些参数如:
- "fps" - 显示当前帧率
- "cpu" - 显示平均CPU负载
- "cpu0" - 显示第一个CPU核心负载
- "cpu0+cpu1" - 显示前两个CPU核心负载
- "draw-calls" - 显示一个物体的每个材质被显示到屏幕上多少次(displays how many times each material in an object is drawn to the screen)
- "requested-VRAM" - 显示GPU的VRAM使用量
- "pixels-rendered" - 显示正在显示的像素计数
关于参数的完整列表以及操作GALLIUM_HUD的一些注意事项,你可以添加"help"参数运行一个简单程序(如glxgears)来查看相应的终端输出。
# GALLIUM_HUD="help" glxgears