防止 Radeon 驱动程序连接到特定的 PCI 设备?

防止 Radeon 驱动程序连接到特定的 PCI 设备?

这台机器上有两张 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

  1. lspci -nn | grep Cayman找到vendor:device6950 及其 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]
    
  2. 弹出/etc/initramfs-tools/modules并添加新行:

    pci_stub ids=1002:6719,1002:aa80
    
  3. 重建initramfs

    sudo update-initramfs -u
    
  4. 重新启动并观察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
    
  5. 享受无蓝屏 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为该卡加载另一个模块。

相关内容