Czy uniemożliwić sterownikowi Radeon podłączenie do określonych urządzeń PCI?

13

Mam dwie karty Radeon w tym urządzeniu, Radeon HD 6570 i Radeon HD 6950 :

lspci | grep VGA

01: 00.0 Kontroler zgodny z VGA: zaawansowane urządzenia Micro [AMD] z ATI Turks [Radeon HD 6570]
02: 00.0 Kontroler zgodny z VGA: zaawansowane urządzenia Micro [AMD] z ATI Cayman PRO [Radeon HD 6950]

Próbuję przekonać VGA do współpracy z KVM na Debianie 7 (Wheezy), przekazując 6950 jako dodatkową kartę graficzną gościowi Windows 7. Działa to dobrze, jeśli umieszczę radeonmoduł jądra na czarnej liście /etc/modprobe.d/.

Jeśli usunę czarną listę, aby uruchomić X11 (lub nawet konsolę KMS ) na 6570, radeonmoduł wydaje się dołączać do obu kart:

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

pci 0000: 01: 00.0: [1002: 6759] typ 0 klasa 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: obsługuje D1 D2
pci 0000: 02: 00.0 : [1002: 6719] typ 0 klasa 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: obsługuje D1 D2
vgaarb: dodane urządzenie: PCI: 0000: 01: 00.0, dekoduje = io + mem, posiada = io + mem, blokuje = brak
vgaarb: dodano urządzenie: PCI: 0000: 02: 00.0, dekoduje = io + mem, posiada = brak , locks = none
vgaarb: możliwa kontrola mostu 0000: 02: 00.0
vgaarb: możliwa kontrola mostu 0000: 01: 00.0
pci 0000: 01: 00.0:
Włączone ustawienie trybu rozruchowego urządzenia wideo [drm] radeon jądra.
radeon 0000: 01: 00.0: ustawienie timera opóźnienia na 64
radeon 0000: 01: 00.0: VRAM: 1024M 0x0000000000000000 - 0x000000003FFFFFFF (używane 1024M)
radeon 0000: 01: 00.0: GTT: 512M 0x0000000040000000 - 0x000000005FFFFFFF
[drM] gotowe do pamięci
[drm] radeon: 512 MB gotowej pamięci GTT.
radeon 0000: 01: 00.0: irq 46 dla MSI / MSI-X
radeon 0000: 01: 00.0: radeon: using MSI.
[drm] radeon: zainicjowano irq.
radeon 0000: 01: 00.0: WB włączony
[drm] radeon: ib pool gotowy.
[drm] radeon: zainicjowane zarządzanie energią
fbcon: radeondrmfb (fb0) jest urządzeniem podstawowym
fb0: urządzenie buforujące ramkę radeondrmfb
[drm] Zainicjowany radeon 2.12.0 20080528 dla 0000: 01: 00.0 na mniejszym 0
radeon 0000: 02: 00.0: urządzenie umożliwiające (0000 -> 0003)
radeon 0000: 02: 00,0: ustawianie ukrytego zegara 64
radeon 0000: 02: 00,0: VRAM: 2048M 0x0000000000000000 - 0x000000007FFFFFFF (2048M używany)
radeon 0000: 02: 00.0: GTT: 512M 0x0000000080000000 - 0x000000009FFFFFFF
[DRM ] radeon: gotowe 2048 MB pamięci VRAM
[drm] radeon: gotowe 512 MB pamięci GTT.
radeon 0000: 02: 00.0: irq 49 dla MSI / MSI-X
radeon 0000: 02: 00.0: radeon: przy użyciu MSI.
[drm] radeon: zainicjowano irq.
radeon 0000: 02: 00.0: WB włączone
[drm] radeon: ib pula gotowa.
[drm] radeon: zainicjowane zarządzanie energią
fb1: urządzenie buforujące ramkę radeondrmfb
[drm] Zainicjowany radeon 2.12.0 20080528 dla 0000: 02: 00.0 na mniejszym 1
[drm] radeon: urządzenie wykończeniowe.
radeon 0000: 02: 00.0: ffff88041a941800 odpinanie nie jest konieczne
[drm] radeon: tm sfinalizowany
pci-stub 0000: 02: 00.0: zgłoszony przez stub
pci-stub 0000: 02: 00.0: irq 49 dla MSI / MSI-X

Powoduje to, że maszyna wirtualna z systemem Windows 7 uruchamia się na niebiesko podczas uruchamiania.

Jak mogę skonfigurować rzeczy, aby moduł radeonpodłączał się tylko do 6570, a nie do 6950?

genpfault
źródło

Odpowiedzi:

14

Miałem pewne pci_stubzwiązane z modelem linii w moim rc.local, ale to było najwyraźniej zbyt późno w procesie rozruchu do pomocy, bieganie po radeonrozpoczął błahy z rzeczy.

Naprawiłem rzeczy, przenosząc elementy pci_stubmodułu jądra do initramfs:

  1. lspci -nn | grep Caymanaby znaleźć vendor:deviceliczby (na samym końcu linii) dla 6950 i portu 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. Otwórz /etc/initramfs-tools/modulesi dodaj nowy wiersz:

    pci_stub ids=1002:6719,1002:aa80
    
  3. Odbuduj initramfs:

    sudo update-initramfs -u
    
  4. Uruchom ponownie i obserwuj pci_stubbicie 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. Ciesz się transmisją VGA bez niebieskiego ekranu!

genpfault
źródło
3
Powyższe nie działało dla mnie. Zamiast tego dodałem pci_stub.ids=1002:6719,1002:aa80na końcu wiersza polecenia jądra w pliku konfiguracyjnym grub. Podejrzewam, że powodem jest to, że pci-stubmoduł jest wbudowany w jądro mojej instalacji.
Mansour,
5

Wykorzystując odpowiedź genpfault jako odniesienie, stworzyłem inną odpowiedź, myślę, że jest prostsza.

Pierwszy krok jest taki sam jak powyżej:

Następnie stworzyłem plik o nazwie /lib/modprobe.d/pci-stub.conf, z tymi znalezionymi przeze mnie argumentami:

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

Następnie utworzyłem plik o nazwie /lib/modprobe.d/drm.conf z softdep:

softdep drm pre: pci-stub

W ten sposób, gdy proces rozruchu próbuje załadować drm, najpierw ładuje pci-stub, który rezerwuje sprzęt jednej karty wideo i zapobiega podłączaniu drm do jakiegoś urządzenia.

Później można usunąć zastrzeżenie rc.local, modprobe -r pci-stub.

Opcjonalnie możesz załadować inny moduł modprobe another-moduledla tej karty.

Weber K.
źródło