Impedir que o driver Radeon se conecte a dispositivos PCI específicos?

13

Eu tenho duas placas Radeon nesta máquina, uma Radeon HD 6570 e uma Radeon HD 6950 :

lspci | grep VGA

01: 00.0 controlador compatível com VGA: Advanced Micro Devices [AMD] e ATI Turks [Radeon HD 6570]
02: 00.0 controlador compatível com VGA: Advanced Micro Devices [AMD] e ATI Cayman PRO [Radeon HD 6950]

Estou tentando fazer com que a transmissão VGA funcione com o KVM no Debian 7 (Wheezy), passando pelo 6950 como uma placa de vídeo secundária para um convidado do Windows 7. Isso funciona bem se eu colocar o radeonmódulo do kernel na lista negra /etc/modprobe.d/.

Se eu remover a lista negra para executar o X11 (ou mesmo apenas um console KMS ) no 6570, o radeonmódulo parecerá anexado aos dois cartões:

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 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: suporta D1 D2
pci 0000: 02: 00.0 : [1002: 6719] classe 0 do tipo 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: suporta D1 D2
vgaarb: dispositivo adicionado: PCI: 0000: 01: 00.0, decodifica = io + mem, possui = io + mem, bloqueios = nenhum
vgaarb: dispositivo adicionado: PCI: 0000: 02: 00.0, decodifica = io + mem, possui = nenhum , bloqueios = nenhum
vgaarb: controle de ponte possível 0000: 02: 00.0
vgaarb: controle de ponte possível 0000: 01: 00.0
pci 0000: 01: 00.0: inicialização do dispositivo de vídeo
[drm] modo de núcleo do radeon ativado.
radeon 0000: 01: 00.0: configurando o timer de latência para 64
radeon 0000: 01: 00.0: VRAM: 1024M 0x0000000000000000 - 0x000000003FFFFFFF (1024M usado)
radeon 0000: 01: 00.0: GTT: 512M 0x0000000040000000 - 0x000000005FFFFFFF
[drm] radeon memory ready
[drm] radeon: 512M de memória GTT pronta.
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 ativado
[drm] radeon: ib pool ready.
[drm] radeon: gerenciamento de energia inicializado
fbcon: radeondrmfb (fb0) é o dispositivo principal
fb0: dispositivo de buffer de quadro radeondrmfb
[drm] Radeon inicializado 2.12.0 20080528 para 0000: 01: 00.0 no dispositivo 0 de menor potência
Radeon 0000: 02: 00.0: habilitado (0000 -> 0003)
radeon 0000: 02: 00,0: ajuste temporizador latência para 64
radeon 0000: 02: 00,0: VRAM: 2048M 0x0000000000000000 - 0x000000007FFFFFFF (2048M utilizado)
radeon 0000: 02: 00,0: GTT: 512M 0x0000000080000000 - 0x000000009FFFFFFF
[DRM ] radeon: 2048M de memória VRAM pronta
[drm] radeon: 512M de memória GTT pronta.
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 ativado
[drm] radeon: ib pool ready.
[drm] radeon: gerenciamento de energia inicializado
fb1: dispositivo de buffer de quadro radeondrmfb
[drm] Radeon inicializado 2.12.0 20080528 para 0000: 02: 00.0 no
dispositivo de acabamento 1 [drm] radeon: final menor .
radeon 0000: 02: 00.0: ffff88041a941800 desafixar não é necessário
[drm] radeon: ttm finalizou o
pci-stub 0000: 02: 00.0: reivindicado pelo stub
pci-stub 0000: 02: 00.0: irq 49 para MSI / MSI-X

Isso faz com que a VM do Windows 7 seja exibida em azul na inicialização.

Como posso configurar as coisas para que o módulo seja radeonconectado apenas ao 6570 e não ao 6950?

genpfault
fonte

Respostas:

14

Eu tinha algumas pci_stublinhas relacionadas no meu, rc.localmas isso aparentemente era tarde demais no processo de inicialização para ajudar, depois que radeoncomecei a mexer nas coisas.

Corrigi as coisas movendo as pci_stubcoisas do módulo do kernel para initramfs:

  1. lspci -nn | grep Caymanpara encontrar os vendor:devicenúmeros (no final da linha) para o 6950 e 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. Abra /etc/initramfs-tools/modulese adicione uma nova linha:

    pci_stub ids=1002:6719,1002:aa80
    
  3. Reconstrua o initramfs:

    sudo update-initramfs -u
    
  4. Reinicie e observe a pci_stubbatida 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. Aproveite a transmissão VGA sem tela azul!

genpfault
fonte
3
O exposto acima não funcionou para mim. Em vez disso, adicionei o pci_stub.ids=1002:6719,1002:aa80final da linha de comando do kernel no arquivo de configuração do grub. Eu suspeito que o motivo é que o pci-stubmódulo está embutido no kernel na minha configuração.
Mansour
1
Referenciado em NVIDIA Gaming Multiheaded usando o Ubuntu 14.04 + KVM (etapa 2).
Peter Mortensen
5

Usando a resposta genpfault como referência, criei outra resposta, acho mais simples.

O primeiro passo é o mesmo que acima:

Então eu criei um arquivo chamado /lib/modprobe.d/pci-stub.conf, com os argumentos que encontrei:

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

Então eu criei um arquivo chamado /lib/modprobe.d/drm.conf, com o softdep:

softdep drm pre: pci-stub

Dessa forma, quando o processo de inicialização tenta carregar o drm, primeiro carrega o pci-stub, que reserva o hardware de uma placa de vídeo e impede que o drm se conecte a algum dispositivo.

Mais tarde, você pode remover a reserva em rc.local modprobe -r pci-stub,.

Opcionalmente, você pode carregar outro módulo modprobe another-modulepara esse cartão.

Weber K.
fonte