***GUIDE*** Passthrough Entire PCI USB Controller


archedraft

Recommended Posts

4 hours ago, vvolfpack said:

I have 3 USB 3.0 controllers with legacy support. I also have XHCI enabled in my BIOS. My motherboard has 2x 2.0 ports and 4x 3.0 ports. Unraid is plugged into a 2.0 port

 


07:00.1 USB controller: Advanced Micro Devices, Inc. [AMD] Matisse USB 3.0 Host Controller
07:00.3 USB controller: Advanced Micro Devices, Inc. [AMD] Matisse USB 3.0 Host Controller
0c:00.3 USB controller: Advanced Micro Devices, Inc. [AMD] Matisse USB 3.0 Host Controller

My Unraid's on Bus 1 (IOMMU Group 21 —07:00.1), whereas the Genesys USB Hub is on Bus 6 (Group 31 — 0c:00.3). 

 

How might I solve for this?

 

 

You can't use the stubbing method you used as all your USB controllers have the same ID.

So you need to look at the new method of stubbing using the PCI ID. I don't remember which release it was added, but go through the release announcements to find it. Might have been 6.8, but might have been in one of the 6.7 releases.

  • Thanks 1
Link to comment
11 hours ago, saarg said:

So you need to look at the new method of stubbing using the PCI ID. I don't remember which release it was added, but go through the release announcements to find it. Might have been 6.8, but might have been in one of the 6.7 releases.

Thanks for the help, saarg! I followed your suggestion and looked up the 6.7 release which led me to this awesome thread. Worked for both, the GPU and the USB hub.

Link to comment
  • 4 weeks later...

Good day all!

 

First of all, thank you very much for this guide! It was very helpful, though I am experiencing an error when I add the hostdev lines of code to the XML file:

 

Quote

Execution error
internal error: Non-endpoint PCI devices cannot be assigned to guests

 

I just installed a PCIe USB3.0 card in my unraid system since the onboard ports have not been playing nicely with anything I plug into them. I've got a W10 VM set up and running nicely that I want to game with. There's a GTX1070 already passed through and I am able to run Dirt Rally 2.0 on my tv and a G27 wheel.

 

Since we're social distancing now, I picked up an Oculus Rift and am having trouble getting it detected in the VM.

 

If I use the VM settings GUI to set up the USB passthrough for all devices (KB, mouse, wheel, Rift headset and Rift sensor), only the Rift headset is not detected within the VM W10 guest (KB, mouse, wheel and Rift sensor all detect fine).

 

I was hoping to pass the USB PCIe card to benefit from USB PnP which would then solve my Rift issue.

 

Here are the results of the steps I followed in the OP:

 

ls | grep USB

Quote


00:14.0 USB controller: Intel Corporation 7 Series/C210 Series Chipset Family USB xHCI Host Controller (rev 04)
00:1a.0 USB controller: Intel Corporation 7 Series/C216 Chipset Family USB Enhanced Host Controller #2 (rev 04)
00:1d.0 USB controller: Intel Corporation 7 Series/C216 Chipset Family USB Enhanced Host Controller #1 (rev 04)
04:00.0 USB controller: Fresco Logic FL1100 USB 3.0 Host Controller (rev 10)
05:00.0 USB controller: VIA Technologies, Inc. VL80x xHCI USB 3.0 Controller (rev 03)

 

 

lsusb

Quote

Bus 006 Device 005: ID 0781:558b SanDisk Corp. Extreme **my test USB key in 1st slot**
Bus 006 Device 006: ID 0781:558b SanDisk Corp. Extreme **my test USB key in 2nd slot**
Bus 005 Device 003: ID 046d:c294 Logitech, Inc. Driving Force **in 3rd**
Bus 005 Device 005: ID 413c:2003 Dell Keyboard **4th**
Bus 005 Device 004: ID 1532:0001 Razer Diamondback **5th**


readlink /sys/bus/usb/devices/usb5

Quote

../../../devices/pci0000:00/0000:00:1c.1/0000:04:00.0/usb5

readlink /sys/bus/usb/devices/usb6

Quote

../../../devices/pci0000:00/0000:00:1c.1/0000:04:00.0/usb6

 

PCIe ACS override is ENABLED

Quote

IOMMU group 8:    [8086:1e12] 00:1c.1 PCI bridge: Intel Corporation 7 Series/C210 Series Chipset Family PCI Express Root Port 2 (rev c4)

 

The lines I added to my XML file:

Quote

    <hostdev mode='subsystem' type='pci' managed='yes'>
      <driver name='vfio'/>
      <source>
        <address domain='0x0000' bus='0x00' slot='0x1c' function='0x1'/>
      </source>
    </hostdev>
    <hostdev mode='subsystem' type='pci' managed='yes'>
      <driver name='vfio'/>
      <source>
        <address domain='0x0000' bus='0x00' slot='0x1c' function='0x4'/>
      </source>
    </hostdev>

 

Without those two hostdev entries (or even just one) I get the error above. Here is my XML file in whole:

Quote

<?xml version='1.0' encoding='UTF-8'?>
<domain type='kvm'>
  <name>Player2</name>
  <uuid>bc7b1d2e-b6e2-bf90-72d2-dd34d956efae</uuid>
  <description>Prodigal son returns</description>
  <metadata>
    <vmtemplate xmlns="unraid" name="Windows 10" icon="windows.png" os="windows10"/>
  </metadata>
  <memory unit='KiB'>8912896</memory>
  <currentMemory unit='KiB'>8912896</currentMemory>
  <memoryBacking>
    <nosharepages/>
  </memoryBacking>
  <vcpu placement='static'>6</vcpu>
  <cputune>
    <vcpupin vcpu='0' cpuset='1'/>
    <vcpupin vcpu='1' cpuset='5'/>
    <vcpupin vcpu='2' cpuset='2'/>
    <vcpupin vcpu='3' cpuset='6'/>
    <vcpupin vcpu='4' cpuset='3'/>
    <vcpupin vcpu='5' cpuset='7'/>
  </cputune>
  <os>
    <type arch='x86_64' machine='pc-i440fx-4.2'>hvm</type>
    <loader readonly='yes' type='pflash'>/usr/share/qemu/ovmf-x64/OVMF_CODE-pure-efi.fd</loader>
    <nvram>/etc/libvirt/qemu/nvram/bc7b1d2e-b6e2-bf90-72d2-dd34d956efae_VARS-pure-efi.fd</nvram>
  </os>
  <features>
    <acpi/>
    <apic/>
    <hyperv>
      <relaxed state='on'/>
      <vapic state='on'/>
      <spinlocks state='on' retries='8191'/>
      <vendor_id state='on' value='none'/>
    </hyperv>
  </features>
  <cpu mode='host-passthrough' check='none'>
    <topology sockets='1' cores='3' threads='2'/>
  </cpu>
  <clock offset='localtime'>
    <timer name='hypervclock' present='yes'/>
    <timer name='hpet' present='no'/>
  </clock>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>restart</on_crash>
  <devices>
    <emulator>/usr/local/sbin/qemu</emulator>
    <disk type='file' device='disk'>
      <driver name='qemu' type='raw' cache='writeback'/>
      <source file='/mnt/user/domains/Player2/vdisk1.img'/>
      <target dev='hdc' bus='virtio'/>
      <boot order='1'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
    </disk>
    <disk type='file' device='cdrom'>
      <driver name='qemu' type='raw'/>
      <source file='/mnt/user/isos/Windows10.iso'/>
      <target dev='hda' bus='ide'/>
      <readonly/>
      <boot order='2'/>
      <address type='drive' controller='0' bus='0' target='0' unit='0'/>
    </disk>
    <disk type='file' device='cdrom'>
      <driver name='qemu' type='raw'/>
      <source file='/mnt/user/isos/virtio-win-0.1.173-2.iso'/>
      <target dev='hdb' bus='ide'/>
      <readonly/>
      <address type='drive' controller='0' bus='0' target='0' unit='1'/>
    </disk>
    <controller type='ide' index='0'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
    </controller>
    <controller type='virtio-serial' index='0'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
    </controller>
    <controller type='pci' index='0' model='pci-root'/>
    <controller type='usb' index='0' model='qemu-xhci' ports='15'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
    </controller>
    <interface type='bridge'>
      <mac address='52:54:00:8a:23:d9'/>
      <source bridge='br0'/>
      <model type='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
    </interface>
    <serial type='pty'>
      <target type='isa-serial' port='0'>
        <model name='isa-serial'/>
      </target>
    </serial>
    <console type='pty'>
      <target type='serial' port='0'/>
    </console>
    <channel type='unix'>
      <target type='virtio' name='org.qemu.guest_agent.0'/>
      <address type='virtio-serial' controller='0' bus='0' port='1'/>
    </channel>
    <input type='tablet' bus='usb'>
      <address type='usb' bus='0' port='3'/>
    </input>
    <input type='mouse' bus='ps2'/>
    <input type='keyboard' bus='ps2'/>
    <sound model='ich9'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0'/>
    </sound>
    <hostdev mode='subsystem' type='pci' managed='yes'>
      <driver name='vfio'/>
      <source>
        <address domain='0x0000' bus='0x02' slot='0x00' function='0x0'/>
      </source>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
    </hostdev>
    <hostdev mode='subsystem' type='pci' managed='yes'>
      <driver name='vfio'/>
      <source>
        <address domain='0x0000' bus='0x02' slot='0x00' function='0x1'/>
      </source>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
    </hostdev>
    <hostdev mode='subsystem' type='pci' managed='yes'>
      <driver name='vfio'/>
      <source>
        <address domain='0x0000' bus='0x00' slot='0x1b' function='0x0'/>
      </source>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x09' function='0x0'/>
    </hostdev>

    <hostdev mode='subsystem' type='pci' managed='yes'>
      <driver name='vfio'/>
      <source>
        <address domain='0x0000' bus='0x00' slot='0x1c' function='0x1'/>
      </source>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x0a' function='0x0'/>
    </hostdev>
    <hostdev mode='subsystem' type='pci' managed='yes'>
      <driver name='vfio'/>
      <source>
        <address domain='0x0000' bus='0x00' slot='0x1c' function='0x4'/>
      </source>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x0b' function='0x0'/>
    </hostdev>

    <memballoon model='none'/>
  </devices>
</domain>

 

I appreciate all ideas! Thanks

Link to comment

There isn't really a need to do it this way anymore.

If the usb card have its own ID (4 digits:4 digits) then you can stub the card in the syslinux.conf file and then choose the card in the other PCI devices part in the VM template.

If the usb card shares an ID with a USB controller on the motherboard, you have to use the new method of stubbing the card using a config file and the PCI number.

Link to comment
4 hours ago, saarg said:

There isn't really a need to do it this way anymore.

If the usb card have its own ID (4 digits:4 digits) then you can stub the card in the syslinux.conf file and then choose the card in the other PCI devices part in the VM template.

If the usb card shares an ID with a USB controller on the motherboard, you have to use the new method of stubbing the card using a config file and the PCI number.

Thank you for replying! I continued to research and read last night an managed to pass the card through using the VFIO-PCI Config plugin.

 

I did give the syslinux.conf method a try by clicking on the flash drive in the GUI, and added the USB controller ID after the "append". With that method the USB controller appeared in the PCI devices section in the VM settings, but then I had the same "guest" error starting up the VM.

 

After removing that line from the syslinux.conf and using the VFIO plugin instead it works!

 

USB PnP is now functional in my W10 VM and so does the Oculus Rift.

Link to comment
  • 1 month later...

I am currently having difficulty passing through a Fresco Logic FL1100 USB 3.0 Host Controller (rev 10).  Tried a number of methods pass it through including the VIFO plugin.

 

 Originally, posted detailed info in the VM (KVM) forum but haven't received a response in a week.   Realize that it might be in the wrong place.   Suggestions are be apricated!

 

 

 

 

Link to comment
  • 3 months later...

Hello,

 

I am new to unraid and trying to get USB passthrough. I saw this topic on passing through a USB Controller, however it seems I only have a single controller...

 

IOMMU group 0:[8086:9b43] 00:00.0 Host bridge: Intel Corporation Device 9b43 (rev 05)

IOMMU group 1:[8086:1901] 00:01.0 PCI bridge: Intel Corporation Xeon E3-1200 v5/E3-1500 v5/6th Gen Core Processor PCIe Controller (x16) (rev 05)

IOMMU group 2:[8086:9bc5] 00:02.0 VGA compatible controller: Intel Corporation Device 9bc5 (rev 05)

IOMMU group 3:[8086:06f9] 00:12.0 Signal processing controller: Intel Corporation Comet Lake PCH Thermal Controller

IOMMU group 4:[8086:06ed] 00:14.0 USB controller: Intel Corporation Comet Lake USB 3.1 xHCI Host Controller

Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

Bus 001 Device 002: ID 0bb4:2744 HTC (High Tech Computer Corp.) CB USB2

Bus 001 Device 003: ID 0781:5575 SanDisk Corp. Cruzer Glide

Bus 001 Device 004: ID 2833:2031 HTC CB USB2

Bus 001 Device 005: ID 046d:c52b Logitech, Inc. Unifying Receiver

Bus 001 Device 006: ID 0bb4:0306 HTC (High Tech Computer Corp.)

Bus 001 Device 007: ID 2833:0031 HTC CB USB2

Bus 001 Device 008: ID 0471:0815 Philips (or NXP) eHome Infrared Receiver

Bus 001 Device 009: ID 0424:274e Standard Microsystems Corp. Cruzer Glide

Bus 001 Device 010: ID 26ce:01a2 ASRock LED Controller

Bus 001 Device 011: ID 8087:0aa7 Intel Corp.

Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub

Bus 002 Device 002: ID 2833:0211 Oculus VR Rift Sensor

Bus 002 Device 003: ID 2833:0211 Oculus VR Rift Sensor

[8086:06ef] 00:14.2 RAM memory: Intel Corporation Comet Lake PCH Shared SRAM

IOMMU group 5:[8086:06e0] 00:16.0 Communication controller: Intel Corporation Comet Lake HECI Controller

IOMMU group 6:[8086:06d2] 00:17.0 SATA controller: Intel Corporation Device 06d2

[3:0:0:0] disk ATA WDC WD40EFRX-68N 0A82 /dev/sdb 4.00TB

[4:0:0:0] disk ATA WDC WD40EFRX-68N 0A82 /dev/sdc 4.00TB

[5:0:0:0] disk ATA WDC WD40EFRX-68N 0A82 /dev/sdd 4.00TB

[6:0:0:0] disk ATA WDC WD40EFRX-68W 0A82 /dev/sde 4.00TB

IOMMU group 7:[8086:06ac] 00:1b.0 PCI bridge: Intel Corporation Comet Lake PCI Express Root Port #21 (rev f0)

IOMMU group 8:[8086:06ba] 00:1c.0 PCI bridge: Intel Corporation Device 06ba (rev f0)

IOMMU group 9:[8086:06bb] 00:1c.3 PCI bridge: Intel Corporation Device 06bb (rev f0)

IOMMU group 10:[8086:0685] 00:1f.0 ISA bridge: Intel Corporation Device 0685

[8086:06c8] 00:1f.3 Audio device: Intel Corporation Comet Lake PCH cAVS

[8086:06a3] 00:1f.4 SMBus: Intel Corporation Comet Lake PCH SMBus Controller

[8086:06a4] 00:1f.5 Serial bus controller [0c80]: Intel Corporation Comet Lake PCH SPI Controller

[8086:0d4d] 00:1f.6 Ethernet controller: Intel Corporation Ethernet Connection (11) I219-V

IOMMU group 11:[10de:1c03] 01:00.0 VGA compatible controller: NVIDIA Corporation GP106 [GeForce GTX 1060 6GB] (rev a1)

IOMMU group 12:[10de:10f1] 01:00.1 Audio device: NVIDIA Corporation GP106 High Definition Audio Controller (rev a1)

IOMMU group 13:[15b7:5009] 02:00.0 Non-Volatile memory controller: Sandisk Corp Device 5009 (rev 01)

[N:0:1:1] disk WDC WDS100T2B0C-00PXH0__1 /dev/nvme0n1 1.00TB

IOMMU group 14:[8086:24fb] 03:00.0 Network controller: Intel Corporation Dual Band Wireless-AC 3168NGW [Stone Peak] (rev 10)

IOMMU group 15:[10ec:8125] 04:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8125 2.5GbE Controller (rev 05)

 

 

 

 

Am I missing something? Is there anyway I can pass through a controller without buying a new motherboard or sacrificing my one and only PCI slot (which I need for video card)?

 

I have a Asrock asrock z490m-itz/ac motherboard

 

Thanks for the help

 

Edited by harmar21
added motherboard
Link to comment
2 hours ago, harmar21 said:

Am I missing something? Is there anyway I can pass through a controller without buying a new motherboard or sacrificing my one and only PCI slot (which I need for video card)?

 

I have a Asrock asrock z490m-itz/ac motherboard

 

I got around it using the M.2 slot (mine was limited to Key A+E)

 

Link to comment
  • 3 months later...

Hi all,

Currently i would like to pass through a USB controller to my WIN 10 VM. Since my actual controller (on the MB) is not in an own IOMMU Group (even not if i change all the VM Manager Settings) and on top he's not resettable,  i want to resolve by buying a new PCI-e USB Card to pass through to my VM, but before i do, i have some questions:

  • Will a new Controller Card be automatically in it's own IOMMU Group?
  • Is there a model / brand / spec. that you suggest?
  • How can i be sure/find out, if the new card will be resettable?

Thanks

Link to comment
  • 3 weeks later...

ok, so i have a Asrock Fatality x99M Killer.

 

i am trying to reliably pass through a keyboard and mouse without having to hot plug them every time using the plugin.

 

i found this article: https://sholland.org but it's a little over my head. but if i understand it correctly it will allow me to pass through certain ports to the VM using ONLY the chipset usb controller

 

can someone break this down for me or perhaps a plugin to make this dummy proof?

Link to comment

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.