Impedire al driver Radeon di collegarsi a dispositivi PCI specifici?


13

Ho due carte Radeon in questa macchina, una Radeon HD 6570 e una Radeon HD 6950 :

lspci | grep VGA

01: 00.0 Controller compatibile VGA: Advanced Micro Devices [AMD] nuovo ATI Turks [Radeon HD 6570]
02: 00.0 Controller compatibile VGA: Advanced Micro Devices [AMD] nuovo ATI Cayman PRO [Radeon HD 6950]

Sto cercando di far funzionare il passthrough VGA con KVM su Debian 7 (Wheezy), passando attraverso il 6950 come scheda video secondaria a un guest Windows 7. Funziona bene se inserisco nella blacklist il radeonmodulo del kernel tramite /etc/modprobe.d/.

Se rimuovo la lista nera per eseguire X11 (o anche solo una console KMS ) sul 6570, il radeonmodulo sembra collegarsi a entrambe le schede:

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

pci 0000: 01: 00.0: [1002: 6759] tipo 0 classe 0x000300
pci 0000: 01: 00.0: reg 10: [mem 0xe0000000-0xefffffff 64 bit 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: supporta D1 D2
pci 0000: 02: 00.0 : [1002: 6719] tipo 0 classe 0x000300
pci 0000: 02: 00.0: reg 10: [mem 0xd0000000-0xdfffffff pref a 64 bit] vgaarb: dispositivo aggiunto: PCI: 0000: 01: 00.0, decodifica = io + mem, proprio = io + mem, blocchi = nessuno vgaarb: dispositivo aggiunto: PCI: 0000: 02: 00.0, decodifica = io + mem, proprietario = nessuno, blocchi = nessuno vgaarb: controllo ponte possibile 0000: 02: 00.0
pci 0000: 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: supporta D1 D2



vgaarb: controllo bridge possibile 0000: 01: 00.0
pci 0000: 01: 00.0: avvio del dispositivo video
drad [drm] impostazione del kernel radeon abilitata.
radeon 0000: 01: 00.0: impostazione timer di latenza di 64
radeon 0000: 01: 00.0: VRAM: 1024M 0x0000000000000000 - 0x000000003FFFFFFF (1024M utilizzato)
radeon 0000: 01: 00.0: GTT: 512M 0x0000000040000000 - 0x000000005FFFFFFF
[DRM] radeon: 1024M di VRAM memory ready
[drm] radeon: 512M di memoria GTT pronta.
radeon 0000: 01: 00.0: irq 46 per MSI / MSI-X
radeon 0000: 01: 00.0: radeon : utilizzando MSI.
[drm] radeon: irq inizializzato.
radeon 0000: 01: 00.0: WB abilitato
[drm] radeon: ib pool ready.
[drm] radeon:
fbcon inizializzato per la gestione dell'alimentazione: radeondrmfb (fb0) è il dispositivo principale
fb0: dispositivo buffer frame radeondrmfb
[drm] Radeon inizializzato 2.12.0 20080528 per 0000: 01: 00.0 su minor 0
radeon 0000: 02: 00.0: abilitazione dispositivo (0000 -> 0003)
radeon 0000: 02: 00.0: impostazione del timer di latenza su 64
radeon 0000: 02: 00.0: VRAM: 2048M 0x0000000000000000 - 0x000000007FFFFFFF (2048M utilizzato)
radeon 0000: 02: 00.0: GTT: 512M 0x0000000080000000 - 0x000000009FFFFFFF
[DRM ] radeon: 2048 M di memoria VRAM pronta
[drm] radeon: 512M di memoria GTT pronta.
radeon 0000: 02: 00.0: irq 49 per MSI / MSI-X
radeon 0000: 02: 00.0: radeon: utilizzo di MSI.
[drm] radeon: irq inizializzato.
radeon 0000: 02: 00.0: WB abilitato
[drm] radeon: ib pool pronto.
[drm] radeon: gestione dell'alimentazione inizializzata
fb1: dispositivo buffer frame radeondrmfb
[drm] Radeon inizializzato 2.12.0 20080528 per 0000: 02: 00.0 su 1 minore
[drm] radeon: dispositivo di finitura.
radeon 0000: 02: 00.0: ffff88041a941800 sblocco non necessario pci-stub 0000: 02: 00.0: irq 49 per MSI / MSI-X
[drm] radeon: ttm finalizzato
pci-stub 0000: 02: 00.0: rivendicato da stub

Questo fa sì che la macchina virtuale Windows 7 esegua il bluescreen all'avvio.

Come posso configurare le cose in modo che il modulo radeonsi colleghi solo al 6570 e non al 6950?

Risposte:


14

Avevo avuto alcune pci_stublinee correlate nel mio, rc.localma questo era apparentemente troppo tardi nel processo di avvio per aiutare, in esecuzione doporadeon iniziato a giocherellare con le cose.

Ho risolto le cose spostando le pci_stubcose del modulo del kernel su initramfs:

  1. lspci -nn | grep Caymanper trovare i vendor:devicenumeri (alla fine della riga) per il 6950 e la sua porta 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. Apri /etc/initramfs-tools/modulese aggiungi una nuova linea:

    pci_stub ids=1002:6719,1002:aa80
    
  3. Ricostruisci il initramfs:

    sudo update-initramfs -u
    
  4. Riavvia e osserva il pci_stubpestaggio 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. Goditi il ​​passthrough VGA privo di schermi blu!


3
Quanto sopra non ha funzionato per me. Invece ho aggiunto pci_stub.ids=1002:6719,1002:aa80alla fine della riga di comando del kernel nel file di configurazione di grub. Sospetto che il motivo sia che il pci-stubmodulo è integrato nel kernel nella mia configurazione.
Mansour,


5

Usando la risposta genpfault come riferimento, ho creato un'altra risposta, penso che sia più semplice.

Il primo passo è lo stesso di sopra:

Quindi ho creato un file chiamato /lib/modprobe.d/pci-stub.conf, con gli arg che ho trovato:

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

Quindi ho creato un file chiamato /lib/modprobe.d/drm.conf, con softdep:

softdep drm pre: pci-stub

In questo modo, quando il processo di avvio tenta di caricare drm, carica prima pci-stub, che riserva l'hardware di una scheda video e impedisce a drm di collegarsi a qualche dispositivo.

Successivamente puoi rimuovere la prenotazione in rc.local, modprobe -r pci-stub .

Opzionalmente puoi caricare un altro modulo modprobe another-moduleper quella scheda.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.