archedraft

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

Recommended Posts

 

Win10 x64, I am just copying over a win 7 iso to try but would rather stick with 10 as I upgraded my install key!

 

Hmm yeah either should work just fine... So it boots up just fine without error but doesn't find the USB controller, correct? Does the device manager show an unknown device? Maybe check your mobo website for drivers? Other than that I don't have a clue

 

Share this post


Link to post
Share on other sites

nothing extra appears in device manager needing drivers. I am stumped really, am I missing something with the XML passthrough?

 

what is the difference between bus=pcie.0 and bus=root.1 ?? why would the usb be root and not a pcie number? or am I just making things up now as I have tried everything else??

Share this post


Link to post
Share on other sites

I think you need to add this first

    <qemu:arg value='-device'/>

    <qemu:arg value='ioh3420,bus=pcie.0,addr=1c.0,multifunction=on,port=1,chassis=1,id=root.1'/>

    <qemu:arg value='-device'/>

    <qemu:arg value='vfio-pci,host=00:14.0,bus=root.1,addr=00.0'/>

 

Hi again. No that didn't work. I didn't add this before because I thought it was for a card. Anyways it throws an error for the following:

<qemu:arg value='ioh3420,bus=pcie.0,addr=1c.0,multifunction=on,port=1,chassis=1,id=root.1'/>[/b]

 

It it possibly the address as I highlighted above?

 

Thanks

 

Depends on what the error message says? Can you post a screen shot?

 

See the scree capture:

Capture.JPG.8902845017fc0c4baf431ec8fc55d22f.JPG

Share this post


Link to post
Share on other sites

 

nothing extra appears in device manager needing drivers. I am stumped really, am I missing something with the XML passthrough?

 

what is the difference between bus=pcie.0 and bus=root.1 ?? why would the usb be root and not a pcie number? or am I just making things up now as I have tried everything else??

 

I would try making a fresh XML of Windows with unraids VM creator and then only modify the lines necessary for USB passthrough. You will have to view your VM though VNC for the moment but try getting just that working first.

Share this post


Link to post
Share on other sites

 

I think you need to add this first

    <qemu:arg value='-device'/>

    <qemu:arg value='ioh3420,bus=pcie.0,addr=1c.0,multifunction=on,port=1,chassis=1,id=root.1'/>

    <qemu:arg value='-device'/>

    <qemu:arg value='vfio-pci,host=00:14.0,bus=root.1,addr=00.0'/>

 

Hi again. No that didn't work. I didn't add this before because I thought it was for a card. Anyways it throws an error for the following:

<qemu:arg value='ioh3420,bus=pcie.0,addr=1c.0,multifunction=on,port=1,chassis=1,id=root.1'/>[/b]

 

It it possibly the address as I highlighted above?

 

Thanks

 

Depends on what the error message says? Can you post a screen shot?

 

See the scree capture:

 

Please post your entire XML as well.

Share this post


Link to post
Share on other sites

Its on page 6 at the bottom.

 

 

 

I think you need to add this first

    <qemu:arg value='-device'/>

    <qemu:arg value='ioh3420,bus=pcie.0,addr=1c.0,multifunction=on,port=1,chassis=1,id=root.1'/>

    <qemu:arg value='-device'/>

    <qemu:arg value='vfio-pci,host=00:14.0,bus=root.1,addr=00.0'/>

 

Hi again. No that didn't work. I didn't add this before because I thought it was for a card. Anyways it throws an error for the following:

<qemu:arg value='ioh3420,bus=pcie.0,addr=1c.0,multifunction=on,port=1,chassis=1,id=root.1'/>[/b]

 

It it possibly the address as I highlighted above?

 

Thanks

 

Depends on what the error message says? Can you post a screen shot?

 

See the scree capture:

 

Please post your entire XML as well.

Share this post


Link to post
Share on other sites

 

I think you need to add this first

    <qemu:arg value='-device'/>

    <qemu:arg value='ioh3420,bus=pcie.0,addr=1c.0,multifunction=on,port=1,chassis=1,id=root.1'/>

    <qemu:arg value='-device'/>

    <qemu:arg value='vfio-pci,host=00:14.0,bus=root.1,addr=00.0'/>

 

Hi again. No that didn't work. I didn't add this before because I thought it was for a card. Anyways it throws an error for the following:

<qemu:arg value='ioh3420,bus=pcie.0,addr=1c.0,multifunction=on,port=1,chassis=1,id=root.1'/>[/b]

 

It it possibly the address as I highlighted above?

 

Thanks

 

I am wanting to see the XML with the above code entered so I can see if I can spot the issue. Your post on line 6 doesn't have the added code.

Share this post


Link to post
Share on other sites

ok done that, fresh build.

 

The only thing now in my xml is + using vnc

<qemu:commandline>

    <qemu:arg value='-device'/>

    <qemu:arg value='ioh3420,bus=pcie.0,addr=1c.0,multifunction=on,port=1,chassis=1,id=root.1'/>

    <qemu:arg value='-device'/>

    <qemu:arg value='vfio-pci,host=09:00.0,bus=root.1,addr=00.1'/>

  </qemu:commandline>

 

Still getting the same, no usb devices work :-(

 

Share this post


Link to post
Share on other sites

 

I think you need to add this first

    <qemu:arg value='-device'/>

    <qemu:arg value='ioh3420,bus=pcie.0,addr=1c.0,multifunction=on,port=1,chassis=1,id=root.1'/>

    <qemu:arg value='-device'/>

    <qemu:arg value='vfio-pci,host=00:14.0,bus=root.1,addr=00.0'/>

 

Hi again. No that didn't work. I didn't add this before because I thought it was for a card. Anyways it throws an error for the following:

<qemu:arg value='ioh3420,bus=pcie.0,addr=1c.0,multifunction=on,port=1,chassis=1,id=root.1'/>[/b]

 

It it possibly the address as I highlighted above?

 

Thanks

 

I am wanting to see the XML with the above code entered so I can see if I can spot the issue. Your post on line 6 doesn't have the added code.

 

 

Sorry, I was hoping the one on page 6 was current enough because I was installing Ubuntu.

 

<domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>
  <name>Test 8</name>
  <uuid>738883d4-0137-3e4e-7bc9-8da467c306eb</uuid>
  <description>test 8</description>
  <metadata>
    <vmtemplate name="Custom" icon="windows.png" os="windows"/>
  </metadata>
  <memory unit='KiB'>10485760</memory>
  <currentMemory unit='KiB'>10485760</currentMemory>
  <memoryBacking>
    <nosharepages/>
    <locked/>
  </memoryBacking>
  <vcpu placement='static'>6</vcpu>
  <cputune>
    <vcpupin vcpu='0' cpuset='2'/>
    <vcpupin vcpu='1' cpuset='3'/>
    <vcpupin vcpu='2' cpuset='4'/>
    <vcpupin vcpu='3' cpuset='5'/>
    <vcpupin vcpu='4' cpuset='6'/>
    <vcpupin vcpu='5' cpuset='7'/>
  </cputune>
  <os>
    <type arch='x86_64' machine='pc-i440fx-2.3'>hvm</type>
  </os>
  <features>
    <acpi/>
    <apic/>
  </features>
  <cpu mode='host-passthrough'>
    <topology sockets='1' cores='6' threads='1'/>
  </cpu>
  <clock offset='localtime'>
    <timer name='rtc' tickpolicy='catchup'/>
    <timer name='pit' tickpolicy='delay'/>
    <timer name='hpet' present='no'/>
  </clock>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>restart</on_crash>
  <devices>
    <emulator>/usr/bin/qemu-system-x86_64</emulator>
    <disk type='file' device='disk'>
      <driver name='qemu' type='raw' cache='writeback'/>
      <source file='/mnt/cache/appdata/ISO share/Test 3/Secondary.img'/>
      <target dev='hdc' bus='virtio'/>
      <boot order='1'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
    </disk>
    <disk type='file' device='cdrom'>
      <driver name='qemu' type='raw'/>
      <source file='/mnt/cache/appdata/ISO share/Windows 10 Pro/Win10.PRO.img'/>
      <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/cache/appdata/ISO share/virtio-win-0.1.102.iso'/>
      <target dev='hdb' bus='ide'/>
      <readonly/>
      <address type='drive' controller='0' bus='0' target='0' unit='1'/>
    </disk>
    <controller type='usb' index='0'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
    </controller>
    <controller type='pci' index='0' model='pci-root'/>
    <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='0x04' function='0x0'/>
    </controller>
    <interface type='bridge'>
      <mac address='52:54:00:1a:34:b4'/>
      <source bridge='br0'/>
      <model type='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
    </interface>
    <serial type='pty'>
      <target port='0'/>
    </serial>
    <console type='pty'>
      <target type='serial' port='0'/>
    </console>
    <channel type='unix'>
      <source mode='bind' path='/var/lib/libvirt/qemu/channel/target/Test 3.org.qemu.guest_agent.0'/>
      <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'/>
    <input type='mouse' bus='ps2'/>
    <input type='keyboard' bus='ps2'/>
    <graphics type='vnc' port='-1' autoport='yes' websocket='-1' listen='0.0.0.0' keymap='en-us'>
      <listen type='address' address='0.0.0.0'/>
    </graphics>
    <video>
      <model type='vmvga' vram='16384' heads='1'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
    </video>
    <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='0x06' function='0x0'/>
    </hostdev>
    <memballoon model='virtio'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
    </memballoon>
  </devices>
  <qemu:commandline>
    <qemu:arg value='-device'/>
    <qemu:arg value='ioh3420,bus=pcie.0,addr=1c.0,multifunction=on,port=1,chassis=1,id=root.1'/>
    <qemu:arg value='-device'/>
    <qemu:arg value='vfio-pci,host=00:14.0,bus=root.1,addr=00.0'/>
  </qemu:commandline>
</domain>

Share this post


Link to post
Share on other sites

For me it's much easier to use the hostdev tag instead of the qemu:arg. It's just too much trouble with it when you don't know what you are doing.

So for passing through a PCI(e) device with the hostdev tag this is the starting code:

 

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

 

You then have to modify some parts of it to get it to work. The good thing is that you do not have to care about which bus and address it's supposed to have in the VM. You only need to find out the host PCI address.

The part you change is bus, slot and function. In your case it's 00:14.0.

Let's brake it down.

00 is the bus. You simply exchange the two numbers after the 0x.

14 is the slot. Same method as above.

0 is the function. Her it's also the same method as above.

So in your case the full device tag would be like this:

 

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

 

After you start the VM you will see that there are some lines added to the tag, but those you don't have to care about. They get created automatically. If you copy a host device tag to pass through a new device, be sure to remove the two lines created after the

</source>

tag, as they are specific to that VM.

 

      <alias name='hostdev2'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0'/>

Share this post


Link to post
Share on other sites

For me it's much easier to use the hostdev tag instead of the qemu:arg. It's just too much trouble with it when you don't know what you are doing.

So for passing through a PCI(e) device with the hostdev tag this is the starting code:

 

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

 

You then have to modify some parts of it to get it to work. The good thing is that you do not have to care about which bus and address it's supposed to have in the VM. You only need to find out the host PCI address.

The part you change is bus, slot and function. In your case it's 00:14.0.

Let's brake it down.

00 is the bus. You simply exchange the two numbers after the 0x.

14 is the slot. Same method as above.

0 is the function. Her it's also the same method as above.

So in your case the full device tag would be like this:

 

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

 

After you start the VM you will see that there are some lines added to the tag, but those you don't have to care about. They get created automatically. If you copy a host device tag to pass through a new device, be sure to remove the two lines created after the

</source>

tag, as they are specific to that VM.

 

      <alias name='hostdev2'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0'/>

 

Thanks saarg I'll set up another VM and give it a go while pursuing closure on Test VM 8.

Share this post


Link to post
Share on other sites

saarg,

 

That work like a charm. I have to let windows do a repair and win it was done every thing was there.

 

Thanks for your support too archedraft

 

Best Regards

 

Share this post


Link to post
Share on other sites

for trying that passthrough method, what should i do with my gfx card passthrough?

If you have a working VM with gfx pass through, you add the usb controller the same way as I described a few posts above. No need to remove any qemu:arg.

Share this post


Link to post
Share on other sites

ahh cool that's what I tried and annoyingly no usb devices found on the VM when I boot it up. I think I am destined to fail at this :-(

 

edit!

I can confirm that this works on my usb2 controller but not on the USB 3 one!

 

If I run unRAID from the USB 3 controller the pen drive gets so hot that it crashes/corrupts the system!!

 

Any ideas/ ways round this? I have 3 sets of USB ports, one set on the front of my case (usb2) , one set on the back that's USB3, and another set of USB2 on the back.

 

I really want the unRaid on the front so that I don't have dangling cables everywhere

Share this post


Link to post
Share on other sites

scratch previous comment, it does work with my usb 3 controller! slightly excited now!! Just need to work out why the device cant start now... probably a driver update/issue will post when I have mucked about with the VM some more... I love you guys thanks for the help :-)

Share this post


Link to post
Share on other sites

For me it's much easier to use the hostdev tag instead of the qemu:arg. It's just too much trouble with it when you don't know what you are doing.

So for passing through a PCI(e) device with the hostdev tag this is the starting code:

 

I added this to the end of the guide, I know it is else where but I think it should be handy anyways. Thanks.

Share this post


Link to post
Share on other sites

For me it's much easier to use the hostdev tag instead of the qemu:arg. It's just too much trouble with it when you don't know what you are doing.

So for passing through a PCI(e) device with the hostdev tag this is the starting code:

 

I added this to the end of the guide, I know it is else where but I think it should be handy anyways. Thanks.

Good choice :)

I just read what you added and it says

Forget passing through an entire controller and just use Hostdev

That's not true :) You are still passing through an entire controller, but only the way to do it is different.

Share this post


Link to post
Share on other sites

Can someone explain what the difference is between qemu passthrough and hostdev please?  I'm not entirely clear on the use cases for each...

Share this post


Link to post
Share on other sites

Can someone explain what the difference is between qemu passthrough and hostdev please?  I'm not entirely clear on the use cases for each...

I just edited my post :)

It's the same. The hostdev way is used in the XML and qemu:arg is not a part of the XML. Did that confuse you more maybe?  ::)

Share this post


Link to post
Share on other sites

Can someone explain what the difference is between qemu passthrough and hostdev please?  I'm not entirely clear on the use cases for each...

I just edited my post :)

It's the same. The hostdev way is used in the XML and qemu:arg is not a part of the XML. Did that confuse you more maybe?  ::)

 

No, I've wondered why there are two separate ways to do things, but never given it too much thought.  So basically they're like two routes to the same destination...

 

No advantages or disadvantages either way?  No reason to choose one over the other?

Share this post


Link to post
Share on other sites

For me it's much easier to use the hostdev tag instead of the qemu:arg. It's just too much trouble with it when you don't know what you are doing.

So for passing through a PCI(e) device with the hostdev tag this is the starting code:

 

I added this to the end of the guide, I know it is else where but I think it should be handy anyways. Thanks.

Good choice :)

I just read what you added and it says

Forget passing through an entire controller and just use Hostdev

That's not true :) You are still passing through an entire controller, but only the way to do it is different.

 

Oops good catch, I was editing the whole first page at a million miles a minute and sort of word vomitted that.

Share this post


Link to post
Share on other sites

So then I suppose even with hostdev you will still have to go through the entire first process of finding out which controller you want?

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Copyright © 2005-2017 Lime Technology, Inc. unRAID® is a registered trademark of Lime Technology, Inc.