¿Evitar que el controlador Radeon se conecte a dispositivos PCI específicos?

13

Tengo dos tarjetas Radeon en esta máquina, una Radeon HD 6570 y una Radeon HD 6950 :

lspci | grep VGA

01: 00.0 Controlador compatible con VGA: Advanced Micro Devices [AMD] nee ATI Turks [Radeon HD 6570]
02: 00.0 Controlador compatible con VGA: Advanced Micro Devices [AMD] nee ATI Cayman PRO [Radeon HD 6950]

Estoy tratando de hacer que VGA passthrough funcione con KVM en Debian 7 (Wheezy), pasando el 6950 como una tarjeta de video secundaria a un invitado de Windows 7. Esto funciona bien si incluyo en la lista negra el radeonmódulo del kernel /etc/modprobe.d/.

Si elimino la lista negra para ejecutar X11 (o incluso solo una consola KMS ) en el 6570, el radeonmódulo parece adjuntarse a ambas tarjetas:

dmesg | egrep "01: 00.0 | 02: 00.0 | radeon"

pci 0000: 01: 00.0: [1002: 6759] tipo 0 clase 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: admite D1 D2
pci 0000: 02: 00.0 : [1002: 6719] tipo 0 clase 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: admite D1 D2
vgaarb: dispositivo agregado: PCI: 0000: 01: 00.0, decodifica = io + mem, posee = io + mem, bloquea = ninguno
vgaarb: dispositivo agregado: PCI: 0000: 02: 00.0, decodifica = io + mem, posee = ninguno , bloqueos = ninguno
vgaarb: control de puente posible 0000: 02: 00.0
vgaarb: control de puente posible 0000: 01: 00.0
pci 0000: 01: 00.0: Arranque del dispositivo de video
[drm] configuración del modo de kernel de radeon habilitado.
radeon 0000: 01: 00,0: Configuración del temporizador de latencia a 64
radeon 0000: 01: 00,0: VRAM: 1024M 0x0000000000000000 - 0x000000003FFFFFFF (1024M utiliza)
radeon 0000: 01: 00,0: GTT: 512M 0x0000000040000000 - 0x000000005FFFFFFF
[DRM] radeon: 1024M de VRAM memoria lista
[drm] radeon: 512M de memoria GTT lista.
radeon 0000: 01: 00.0: irq 46 para MSI / MSI-X
radeon 0000: 01: 00.0: radeon: usando MSI.
[drm] radeon: irq inicializado.
radeon 0000: 01: 00.0: WB habilitado
[drm] radeon: grupo ib listo.
[drm] radeon: administración de energía inicializada
fbcon: radeondrmfb (fb0) es el dispositivo principal
fb0: radeondrmfb dispositivo de almacenamiento de trama
[drm] Inicializado radeon 2.12.0 20080528 para 0000: 01: 00.0 en menor 0
radeon 0000: 02: 00.0: dispositivo habilitador (0000 -> 0003)
radeon 0000: 02: 00.0: Configuración del temporizador de latencia de 64
radeon 0000: 02: 00.0: VRAM: 2048M 0x0000000000000000 - 0x000000007FFFFFFF (2048M utiliza)
radeon 0000: 02: 00.0: GTT: 512M 0x0000000080000000 - 0x000000009FFFFFFF
[DRM ] radeon: 2048M de memoria VRAM lista
[drm] radeon: 512M de memoria GTT lista.
radeon 0000: 02: 00.0: irq 49 para MSI / MSI-X
radeon 0000: 02: 00.0: radeon: usando MSI.
[drm] radeon: irq inicializado.
radeon 0000: 02: 00.0: WB habilitado
[drm] radeon: grupo ib listo.
[drm] radeon: gestión de energía inicializada
fb1: radeondrmfb frame buffer device
[drm] Initialized radeon 2.12.0 20080528 para 0000: 02: 00.0 en menor 1
[drm] radeon: dispositivo de acabado.
radeon 0000: 02: 00.0: ffff88041a941800 unpin no necesario
[drm] radeon: ttm finalizó
pci-stub 0000: 02: 00.0: reclamado por stub
pci-stub 0000: 02: 00.0: irq 49 para MSI / MSI-X

Esto hace que la máquina virtual de Windows 7 muestre una pantalla azul en el arranque.

¿Cómo puedo configurar las cosas para que el módulo radeonsolo se conecte al 6570 y no al 6950?

genpfault
fuente

Respuestas:

14

Había tenido algunas pci_stublíneas relacionadas en mi rc.localpero esto aparentemente era demasiado tarde en el proceso de arranque para ayudar, después de haber radeoncomenzado a jugar con las cosas.

Arreglé las cosas moviendo las pci_stubcosas del módulo del kernel a initramfs:

  1. lspci -nn | grep Caymanpara encontrar los vendor:devicenúmeros (al final de la línea) para el 6950 y su puerto 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. Abre /etc/initramfs-tools/modulesy agrega una nueva línea:

    pci_stub ids=1002:6719,1002:aa80
    
  3. Reconstruir el initramfs:

    sudo update-initramfs -u
    
  4. Reinicie y observe la pci_stubpaliza 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. ¡Disfruta del paso de VGA sin pantalla azul!

genpfault
fuente
3
Lo anterior no funcionó para mí. En cambio, agregué pci_stub.ids=1002:6719,1002:aa80al final de la línea de comandos del kernel en el archivo de configuración de grub. Sospecho que la razón es que el pci-stubmódulo está integrado en el kernel en mi configuración.
Mansour
1
Se hace referencia en Multiheaded NVIDIA Gaming usando Ubuntu 14.04 + KVM (paso 2).
Peter Mortensen
5

Usando la respuesta genpfault como referencia, creé otra respuesta, creo que es más simple.

El primer paso es el mismo que el anterior:

Luego creé un archivo llamado /lib/modprobe.d/pci-stub.conf, con los args que encontré:

options pci-stub ids=1002:9715,1002:970f

Luego creé un archivo llamado /lib/modprobe.d/drm.conf, con softdep:

softdep drm pre: pci-stub

De esta forma, cuando el proceso de arranque intenta cargar drm, primero carga pci-stub, que reserva el hardware de una tarjeta de video y evita que drm se conecte a algún dispositivo.

Más tarde, puede eliminar la reserva en rc.local, modprobe -r pci-stub .

Opcionalmente, puede cargar otro módulo modprobe another-modulepara esa tarjeta.

Weber K.
fuente