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

gen*_*ult 13 linux debian amd-radeon linux-kvm debian-wheezy

我在这台机器上有两张 Radeon 卡,一张Radeon HD 6570和一张Radeon HD 6950

lspci | grep VGA
Run Code Online (Sandbox Code Playgroud)

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 (Wheezy)上的KVM 一起使用,将 6950 作为辅助视频卡传递给 Windows 7 来宾。如果我通过.radeon/etc/modprobe.d/

如果我删除黑名单以在 6570 上运行 X11(甚至只是一个KMS控制台),该radeon模块似乎连接到两个卡:

留言 | egrep "01:00.0|02:00.0|radeon"

pci 0000:01:00.0: [1002:6759] type 0 class 0x000300
pci 0000:01:00.0: reg 10: [mem 0xe0000000-0xefffffff 64bit pref]
pci:1000000000000000000000000000000000000000000000000000000001 ]
pci 0000:01:00.0: reg 20: [io 0xe000-0xe0ff]
pci 0000:01:00.0: reg 30: [mem 0xf7e00000-0xf7e1ffff pref]
pci: 0000.0020:D.020支持
pci:D.0020 :[1002:6719]类型0类0x000300
PCI 0000:02:00.0:REG 10:[MEM 0xd0000000-0xdfffffff 64位PREF]
PCI 0000:02:00.0:REG 18:[MEM 0xf7d20000-0xf7d3ffff 64]
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 - (使用1024M)0x000000003FFFFFFF
RADEON 0000:01:00.0:GTT:512M 0x0000000040000000 - 0x000000005FFFFFFF
[DRM] RADEON:VRAM的1024M内存就绪
[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] 初始化 radeon 2.12.0 20080528 for 0000:01:00.0 on minor 0 radeon2: 0000.0 enable
device (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] 初始化 radeon 2.12.0 20080528 for 0000:02:00.0 on minor 1
[drm] radeon:完成设备。
radeon 0000:02:00.0: ffff88041a941800 unpin 不需要
[drm] radeon: ttm 最终确定的
pci-stub 0000:02:00.0: stub
pci-stub 0000:02:00.0: for MSI/MSI-49

这会导致 Windows 7 VM 在启动时蓝屏。

我如何配置东西以便模块radeon只连接到 6570 而不是 6950?

gen*_*ult 14

我有一些与我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]
    
    Run Code Online (Sandbox Code Playgroud)
  2. 弹出打开/etc/initramfs-tools/modules并添加一个新行:

    pci_stub ids=1002:6719,1002:aa80
    
    Run Code Online (Sandbox Code Playgroud)
  3. 重建initramfs

    sudo update-initramfs -u
    
    Run Code Online (Sandbox Code Playgroud)
  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
    
    Run Code Online (Sandbox Code Playgroud)
  5. 享受无蓝屏 VGA 直通!

  • 以上对我不起作用。相反,我在 grub 配置文件的内核命令行末尾添加了 `pci_stub.ids=1002:6719,1002:aa80`。我怀疑原因是在我的设置中,`pci-stub` 模块内置于内核中。 (3认同)

小智 5

使用 genpfault 答案作为参考,我创建了另一个答案,我认为更简单。

第一步和上面一样:

然后我创建了一个名为 /lib/modprobe.d/pci-stub.conf 的文件,其中包含我找到的参数:

options pci-stub ids=1002:9715,1002:970f
Run Code Online (Sandbox Code Playgroud)

然后我用softdep创建了一个名为/lib/modprobe.d/drm.conf的文件:

softdep drm pre: pci-stub
Run Code Online (Sandbox Code Playgroud)

这样,当引导进程尝试加载 drm 时,首先加载 pci-stub,它保留了一个视频卡的硬件,并防止 drm 附加到某些设备。

稍后您可以删除 rc.local, 中的保留modprobe -r pci-stub

您可以modprobe another-module选择为该卡加载另一个模块。