Quadro P2200 Transcoding

I have a Dell R730 server running Windows Server 2019. It has a Debian Linux VM running Plex and Jellyfin servers, and I wanted to add hardware transcoding with a video card, as certain high resolution HDR videos were not easily converted in real time using the CPU only (which also burned a lot of power). I decided to go with a used NVIDIA Quadro P2200, as it has relatively good codec support, does not require additional power past the PCI slot itself, and was inexpensive.

Getting the Quadro P2200 working as a transcoder for Jellyfin and Plex is a multi-step process. This includes configuration in Windows Server, then configuration in the host OS (Debian in this case). Then it requires setting up the player software to use the card. Finally, we have to manage fan settings to keep noise down but temperatures in check. There are a number of required steps.

Installing and Assigning the Card

In Windows Server 2019 we have to find the PCI information for the card, then remove that card from Windows so we can assign it in passthrough to a virtual machine. Here are the steps I followed to do that.

Find the Card

When I installed the card it showed up as just a generic display device, non-functional. Since I didn’t want to use it in Windows directly I installed no drivers, nor did I try to fix the issue where Windows couldn’t use the card (which installing the drivers would probably have fixed).

I generally followed these instructions to assign the card. Though I will put my specifics here.

In Device Manger I opened the properties of the non-functional card to find its Location, enumerated below.

Device Path: PCIROOT(0)#PCI(0200)#PCI(0000)

I confirmed this using Powershell:

Get-PnpDevice | Where-Object {$_.Present -eq $true} | Where-Object {$_.Class -eq "Display"}|select Name,InstanceId

Name                            InstanceId
----                            ----------
Microsoft Basic Display Adapter PCI\VEN_10DE&DEV_1C31&SUBSYS_131B1028&REV_A1\4&6FCA102&0&0010
Microsoft Basic Display Adapter PCI\VEN_102B&DEV_0534&SUBSYS_06001028&REV_01\7&2D5BC59B&0&00000000E7

Get-PnpDevice -Class Display | ForEach-Object { Write-Output "$($_.FriendlyName) has a device id of $($_.DeviceId) and is located at $($_ | Get-PnpDeviceProperty DEVPKEY_Device_LocationPaths | Select-Object -ExpandProperty Data | Where-Object { $_ -like "PCIROOT*" })"; }
Microsoft Basic Display Adapter has a device id of PCI\VEN_10DE&DEV_1C31&SUBSYS_131B1028&REV_A1\4&6FCA102&0&0010 and is located at PCIROOT(0)#PCI(0200)#PCI(0000)
Microsoft Basic Display Adapter has a device id of PCI\VEN_102B&DEV_0534&SUBSYS_06001028&REV_01\7&2D5BC59B&0&00000000E7 and is located at PCIROOT(0)#PCI(1C07)#PCI(0000)#PCI(0000)#PCI(0000)#PCI(0000)

Disable and Remove the Card from Windows

First, disable the card in Device Manager by right clicking and selecting Disable device. Next, remove the card from Windows in Powershell so we can assign it to the VM.

Dismount-VmHostAssignableDevice -LocationPath "PCIROOT(0)#PCI(0200)#PCI(0000)" -Force

Configure and Assign Card to VM

First, shut down the VM or none of this will work. Then, let’s get going.

Set memory options.

Set-VM -Name video -GuestControlledCacheTypes $True -LowMemoryMappedIoSpace 3Gb -HighMemoryMappedIoSpace 33280Mb

Assign card to the guest OS

Add-VMAssignableDevice -VMName video -LocationPath "PCIROOT(0)#PCI(0200)#PCI(0000)"

Removing Card

If we want to take the card back and give it to windows (so we can remove it, for example) we need to undo this.

Remove-VMAssignableDevice -VMName video -LocationPath "PCIROOT(0)#PCI(0200)#PCI(0000)"
Mount-VMHostAssignableDevice -LocationPath "PCIROOT(0)#PCI(0200)#PCI(0000)"

Configure Guest OS

Now that the card has been assigned to the VM, the Media Server video in this case, we can configure it then start it up and confirm the OS can see it, then get drivers installed.

First, disable secure boot in Hyper-V manager since I don’t want to deal with module signing for the NVIDIA drivers. Then start it up.

The system is running Debian 13.4 Trixie. We are following this general guide from the Debian wiki.

First, see if the card is seen by the OS, or none of this matters.

$ lspci | grep -iE "3d|display|vga"
b568:00:00.0 VGA compatible controller: NVIDIA Corporation GP106GL [Quadro P2200] (rev a1)

Add Repositories

We need to add the non-free and contrib repositories to Debian to get the drivers. Edit /etc/apt/sources.list and add them to the main and updates entries at least. My current file is below:

deb http://deb.debian.org/debian/ trixie main non-free-firmware non-free contrib
deb-src http://deb.debian.org/debian/ trixie main non-free-firmware non-free contrib

deb http://security.debian.org/debian-security trixie-security main non-free-firmware non-free contrib
deb-src http://security.debian.org/debian-security trixie-security main non-free-firmware non-free contrib

# trixie-updates, to get updates before a point release is made;
# see https://www.debian.org/doc/manuals/debian-reference/ch02.en.html#_updates_and_backports
deb http://deb.debian.org/debian/ trixie-updates main non-free-firmware non-free contrib
deb-src http://deb.debian.org/debian/ trixie-updates main non-free-firmware non-free contrib

Check Driver Recommendations

Install nvidia-detect to see what it recommends for driver options. In this case we have a Pascal card and it recommends the nvidia-driver package.

$ nvidia-detect
Detected NVIDIA GPUs:
b568:00:00.0 VGA compatible controller [0300]: NVIDIA Corporation GP106GL [Quadro P2200] [10de:1c31] (rev a1)

Checking card: 00.0 VGA compatible controller
Your card is supported by all driver versions.
Your card is also supported by the Tesla 535 drivers series.
It is recommended to install the
    nvidia-driver
package.

Update Repos and Install Kernel Headers

The NVIDIA driver is stupid though and so modules need to be compiled. So install the Linux headers package to make this possible.

$ sudo apt update && sudo apt install linux-headers-generic

Install NVIDIA drivers

We have two options, but the proprietary one seems to work better or this card. I ran into errors with the open version.

$ sudo apt install nvidia-kernel-dkms nvidia-driver

Confirm it was successfully installed.

$ sudo dkms status | grep nvidia
nvidia-current/550.163.01, 6.12.86+deb13-amd64, x86_64: installed

Then reboot just in case.

Configure Software

Now that the system has the card and drivers assigned and installed we can confirm it is working and configure Jellyfin and Plex.

Jellyfin

I followed Jellyfin’s documentation for this.

Some of these steps didn’t appear to be necessary as the software was already installed, but I did it anyways per the guide:

sudo apt update && sudo apt install -y jellyfin-ffmpeg7
sudo apt update && sudo apt install -y libnvcuvid1 libnvidia-encode1

Then I checked the card by running nvidia-smi:

$ nvidia-smi 
Fri May 15 09:56:55 2026       
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 550.163.01             Driver Version: 550.163.01     CUDA Version: 12.4     |
|-----------------------------------------+------------------------+----------------------+
| GPU  Name                 Persistence-M | Bus-Id          Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |           Memory-Usage | GPU-Util  Compute M. |
|                                         |                        |               MIG M. |
|=========================================+========================+======================|
|   0  Quadro P2200                   Off |   0000B568:00:00.0 Off |                  N/A |
| 50%   41C    P8              4W /   75W |       3MiB /   5120MiB |      0%      Default |
|                                         |                        |                  N/A |
+-----------------------------------------+------------------------+----------------------+

+-----------------------------------------------------------------------------------------+
| Processes:                                                                              |
|  GPU   GI   CI        PID   Type   Process name                              GPU Memory |
|        ID   ID                                                               Usage      |
|=========================================================================================|
|  No running processes found                                                             |
+-----------------------------------------------------------------------------------------+

This seemed OK, so I went to configuring Jellyfin in the web interface. I used the supported formats list from the NVIDIA Video Encode and Decode Matrix for the P2200 and checked those it supported, and enabled H265 encoding as the page said it supported that. I initially checked the AV1 encoding box as well but that was a mistake as the card does not support that.

Plex

Plex seemed to configure itself automatically. I checked the configuration and it saw the card, and so I didn’t change any settings.

Deal with Fans

Because Dell doesn’t recognize the little card it really ramps up the fans to ensure adequate cooling airflow. This is great and all, in theory, but my home is not a datacenter. So we’ll let the card cook and see if it gives us any trouble down the road.

To disable the fast fan curve, we need to run remote ipmi commands.

First, in the idrac interface, enable remote ipmi interface.

Now that that’s done, use ipmitool to configure the fan curves, as described in this article.

I installed ipmitool on my desktop Linux workstation, then ran this command to reset the fan curve:

ipmitool -I lanplus -H ip.address -U root -P password raw 0x30 0xce 0x00 0x16 0x05 0x00 0x00 0x00 0x05 0x00 0x01 0x00 0x00 

To reset this, you can use ipmitool again:

ipmitool -I lanplus -H ip.address -U root -P password raw 0x30 0xce 0x00 0x16 0x05 0x00 0x00 0x00 0x05 0x00 0x00 0x00 0x00

Now the fans will run as normal and mostly base themselves on the CPU temperatures. This is a potential problem depending on ambient temps, as even though the card is low power, in encoding it uses about 60 watts, and in a test encode the tiny fan on it got up to 99% trying to hold it at the target temp of 82° C.

So in idrac I went to the fans and set the minimum fan speed to 20% to increase the base airflow through the cse. The sound level is still relatively low, and the temperatures seem to stay in range. However, it is more audible than the \~14 – 16% the fans typically idle at.

Other options include letting the card cook, as it is only used intermittently anyways and will throttle, putting a larger cooler on it, redirecting some airflow, or using ipmi commands to manually control the fans when a movie is transcoding. I could also log in and manually change the fan speeds when needed. But my goal is to keep the noise levels low.

I may leave it as is and let the card cook, at least for now, until I get a more suitable place to stow the machine. It’ll probably be fine.

Posted on 16 May 2026