Tried passing through a Turing 1660 Ti today and was able to successfully do so, however, it comes with a note if you’re coming from Pascal:
There are FOUR devices you need to passthrough, and to retain the multifunction trait for the libvirt XML, I had to manually add a few entries. Adding entries using virt-manager is not recommended because it will mess things up if you previously had a multifunction listing in your XML.
Here’s the 4 devices:
05:00.0 VGA compatible controller [0300]: NVIDIA Corporation TU116 [GeForce GTX 1660 Ti] [10de:2182] (rev a1)
05:00.1 Audio device [0403]: NVIDIA Corporation Device [10de:1aeb] (rev a1)
05:00.2 USB controller [0c03]: NVIDIA Corporation Device [10de:1aec] (rev a1)
05:00.3 Serial bus controller [0c80]: NVIDIA Corporation Device [10de:1aed] (rev a1)
And I had to make corresponding changes to the libvirt XML to accommodate it
From
...
<hostdev mode='subsystem' type='pci' managed='yes'>
<source>
<address domain='0x0000' bus='0x05' slot='0x00' function='0x0'/>
</source>
<address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0' multifunction='on'/>
</hostdev>
<hostdev mode='subsystem' type='pci' managed='yes'>
<source>
<address domain='0x0000' bus='0x05' slot='0x00' function='0x1'/>
</source>
<address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x1'/>
</hostdev>
...
to
...
<hostdev mode='subsystem' type='pci' managed='yes'>
<source>
<address domain='0x0000' bus='0x05' slot='0x00' function='0x0'/>
</source>
<address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0' multifunction='on'/>
</hostdev>
<hostdev mode='subsystem' type='pci' managed='yes'>
<source>
<address domain='0x0000' bus='0x05' slot='0x00' function='0x1'/>
</source>
<address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x1'/>
</hostdev>
<hostdev mode='subsystem' type='pci' managed='yes'>
<source>
<address domain='0x0000' bus='0x05' slot='0x00' function='0x2'/>
</source>
<address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x2'/>
</hostdev>
<hostdev mode='subsystem' type='pci' managed='yes'>
<source>
<address domain='0x0000' bus='0x05' slot='0x00' function='0x3'/>
</source>
<address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x3'/>
</hostdev>
...
Do also note the USB-C controller calls on the XHCI kernel driver so it loads before vfio-pci
. You will need to sometimes use pci-stub
on XHCI controllers due to the order some distros or kernel ramdisks load modules.
And the 1660 Ti still has the devices for USB-C and a Serial connection, but are hand me downs from the RTX 2060, and it does not mean they work. However, they are all in the same IOMMU group so they need to be passed through together:
Output of my improved LS-IOMMU for the 1660 Ti:
IOMMU Group 22
Slot: 05:00.0
Class: VGA compatible controller
Vendor: NVIDIA Corporation
Device: TU116 [GeForce GTX 1660 Ti]
IDs: 10de:2182
Rev: a1
IOMMU Group 22
Slot: 05:00.1
Class: Audio device
Vendor: NVIDIA Corporation
Device: Device 1aeb
IDs: 10de:1aeb
Rev: a1
IOMMU Group 22
Slot: 05:00.2
Class: USB controller
Vendor: NVIDIA Corporation
Device: Device 1aec
IDs: 10de:1aec
Rev: a1
IOMMU Group 22
Slot: 05:00.3
Class: Serial bus controller [0c80]
Vendor: NVIDIA Corporation
Device: Device 1aed
IDs: 10de:1aed
Rev: a1
That’s basically it. If you’re used to Pascal, just be aware Nvidia has more devices in the same IOMMU group that needs to be passed through.