这台机器上有两张 Radeon 卡,一张Radeon HD 6570和一个Radeon HD 6950:
lspci | grep VGA
01:00.0 VGA 兼容控制器:Advanced Micro Devices [AMD] nee ATI Turks [Radeon HD 6570]
02:00.0 VGA 兼容控制器:Advanced Micro Devices [AMD] nee ATI Cayman PRO [Radeon HD 6950]
我正在尝试使用 VGA 直通虚拟机在Debian 7(喘息),通过 6950 作为辅助视频卡传递给 Windows 7 客户机。如果我radeon
通过 将内核模块列入黑名单,则此方法可正常工作/etc/modprobe.d/
。
如果我删除黑名单来运行X11(或者甚至只是一个知识管理系统控制台)在 6570 上,radeon
模块似乎连接到两个都牌:
消息 | egrep "01:00.0|02:00.0|radeon"
pci 0000:01:00.0:[1002:6759] 类型 0 类 0x000300
pci 0000:01:00.0:reg 10:[mem 0xe0000000-0xefffffff 64bit pref]
pci 0000:01:00.0:reg 18:[mem 0xf7e20000-0xf7e3ffff 64bit]
pci 0000:01:00.0:reg 20:[io 0xe000-0xe0ff]
pci 0000:01:00.0:reg 30:[mem 0xf7e00000-0xf7e1ffff pref]
pci 0000:01:00.0:支持 D1 D2
pci 0000:02:00.0:[1002:6719] 类型 0 类 0x000300
pci 0000:02:00.0:reg 10:[mem 0xd0000000-0xdfffffff 64bit pref]
pci 0000:02:00.0:reg 18:[mem 0xf7d20000-0xf7d3ffff 64bit]
pci 0000:02:00.0:reg 20:[io 0xd000-0xd0ff]
pci 0000:02:00.0:reg 30:[mem 0xf7d00000-0xf7d1ffff pref]
pci 0000:02:00.0:支持 D1 D2
vgaarb:设备添加:PCI:0000:01:00.0,decodes=io+mem,owns=io+mem,locks=none
vgaarb:设备添加:PCI:0000:02:00.0,decodes=io+mem,owns=none,locks=none
vgaarb:桥控制可能 0000:02:00.0
vgaarb:桥控制可能 0000:01:00.0
pci 0000:01:00.0:启动视频设备
[drm] radeon 内核模式设置已启用。
radeon 0000:01:00.0: 将延迟计时器设置为 64
radeon 0000:01:00.0: VRAM:1024M 0x0000000000000000 - 0x000000003FFFFFFF(已使用 1024M)
radeon 0000:01:00.0: GTT:512M 0x0000000040000000 - 0x000000005FFFFFFF
[drm] radeon:1024M VRAM 内存已准备就绪
[drm] radeon:512M GTT 内存已准备就绪。
radeon 0000:01:00.0:MSI/MSI-X 的 irq 46
radeon 0000:01:00.0:radeon:使用 MSI。
[drm] radeon:irq 已初始化。radeon
0000:01:00.0:WB 已启用
[drm] radeon:ib 池已准备就绪。
[drm] radeon:电源管理已初始化
fbcon:radeondrmfb(fb0)是主设备
fb0:radeondrmfb 帧缓冲设备
[drm] 在次要版本 0 上为 0000:01:00.0 初始化 radeon 2.12.0 20080528
radeon 0000:02:00.0:启用设备(0000 -> 0003)
radeon 0000:02:00.0:将延迟计时器设置为 64
radeon 0000:02:00.0:VRAM:2048M 0x0000000000000000 - 0x000000007FFFFFFF(已使用 2048M)
radeon 0000:02:00.0:GTT:512M 0x0000000080000000 - 0x000000009FFFFFFF
[drm] radeon: 2048M VRAM 内存已准备就绪
[drm] radeon: 512M GTT 内存已准备就绪。
radeon 0000:02:00.0: MSI/MSI-X 的 irq 49
radeon 0000:02:00.0: radeon: 使用 MSI。
[drm] radeon: irq 已初始化。
radeon 0000:02:00.0: WB 已启用
[drm] radeon: ib 池已准备就绪。
[drm] radeon: 电源管理已初始化
fb1: radeondrmfb 帧缓冲设备
[drm] 已在次要版本 1 上为 0000:02:00.0 初始化 radeon 2.12.0 20080528
[drm] radeon:完成设备。radeon
0000:02:00.0:ffff88041a941800 无需取消固定
[drm] radeon:ttm 完成
pci-stub 0000:02:00.0:由存根声明
pci-stub 0000:02:00.0:IRQ 49 用于 MSI/MSI-X
这会导致 Windows 7 VM 在启动时出现蓝屏。
我该如何配置才能使模块radeon
只连接到 6570 而不连接到 6950?
答案1
我曾经有过pci_stub
相关行在我rc.local
看来,但这显然在启动过程中为时已晚,无法提供帮助,在radeon
开始摆弄东西之后运行。
我通过将pci_stub
内核模块内容移至以下位置来修复问题initramfs
:
lspci -nn | grep Cayman
找到vendor:device
6950 及其 HDMI 端口的数字(位于行末):02:00.0 VGA compatible controller [0300]: Advanced Micro Devices [AMD] nee ATI Cayman PRO [Radeon HD 6950] [1002:6719] 02:00.1 Audio device [0403]: Advanced Micro Devices [AMD] nee ATI Cayman/Antilles HDMI Audio [Radeon HD 6900 Series] [1002:aa80]
弹出
/etc/initramfs-tools/modules
并添加新行:pci_stub ids=1002:6719,1002:aa80
重建
initramfs
:sudo update-initramfs -u
重新启动并观察
pci_stub
跳动情况radeon
:dmesg | egrep "pci-stub|radeon" pci-stub: add 1002:6719 sub=FFFFFFFF:FFFFFFFF cls=00000000/00000000 pci-stub 0000:02:00.0: claimed by stub pci-stub: add 1002:AA80 sub=FFFFFFFF:FFFFFFFF cls=00000000/00000000 pci-stub 0000:02:00.1: claimed by stub [drm] radeon kernel modesetting enabled. radeon 0000:01:00.0: setting latency timer to 64 radeon 0000:01:00.0: VRAM: 1024M 0x0000000000000000 - 0x000000003FFFFFFF (1024M used) radeon 0000:01:00.0: GTT: 512M 0x0000000040000000 - 0x000000005FFFFFFF
享受无蓝屏 VGA 直通!
答案2
使用 genpfault 答案作为参考,我创建了另一个答案,我认为更简单。
第一步和上面一样:
然后我创建了一个名为 /lib/modprobe.d/pci-stub.conf 的文件,其中包含我找到的参数:
options pci-stub ids=1002:9715,1002:970f
然后我使用 softdep 创建了一个名为 /lib/modprobe.d/drm.conf 的文件:
softdep drm pre: pci-stub
这样,当启动过程尝试加载 drm 时,首先加载 pci-stub,它会保留一个视频卡的硬件,并阻止 drm 附加到某些设备。
稍后您可以删除 rc.local 中的保留modprobe -r pci-stub
。
您可以选择modprobe another-module
为该卡加载另一个模块。