win amd GPU passtrough
This commit is contained in:
203
portainer-compose-stacks/windows/GPU-PASSTHROUGH.md
Normal file
203
portainer-compose-stacks/windows/GPU-PASSTHROUGH.md
Normal file
@@ -0,0 +1,203 @@
|
||||
# AMD Strix Halo iGPU Passthrough to Windows Container
|
||||
|
||||
This guide configures PCI passthrough for the AMD Strix Halo integrated GPU to the Windows Docker container, enabling GPU-accelerated applications.
|
||||
|
||||
## Problem
|
||||
|
||||
The Windows container was showing "Red Hat VirtIO GPU DOD Controller" instead of the AMD GPU because:
|
||||
- IOMMU was disabled (`amd_iommu=off`)
|
||||
- GPU was not passed through at PCI level
|
||||
- Only `/dev/dri` devices were exposed (insufficient for Windows)
|
||||
|
||||
## Solution Overview
|
||||
|
||||
1. Enable AMD IOMMU in kernel boot parameters
|
||||
2. Bind GPU and audio devices to `vfio-pci` driver
|
||||
3. Configure QEMU to pass through PCI devices
|
||||
4. Restart container and install AMD drivers in Windows
|
||||
|
||||
## Hardware Details
|
||||
|
||||
- **GPU**: AMD Strix Halo iGPU (PCI: c5:00.0, ID: 1002:1586)
|
||||
- **Audio**: HDMI Audio Controller (PCI: c5:00.1, ID: 1002:1640)
|
||||
|
||||
## Setup Instructions
|
||||
|
||||
### Step 1: Run Setup Script
|
||||
|
||||
```bash
|
||||
cd /mnt/shared/DEV/repos/d-popov.com/scripts/portainer-compose-stacks/windows
|
||||
sudo ./setup-gpu-passthrough.sh
|
||||
```
|
||||
|
||||
This script will:
|
||||
- Enable IOMMU in GRUB (`amd_iommu=on iommu=pt`)
|
||||
- Configure VFIO to claim the GPU devices
|
||||
- Update initramfs with VFIO modules
|
||||
- Create necessary configuration files
|
||||
|
||||
### Step 2: Reboot
|
||||
|
||||
```bash
|
||||
sudo reboot
|
||||
```
|
||||
|
||||
**IMPORTANT**: The system MUST be rebooted for IOMMU and VFIO changes to take effect.
|
||||
|
||||
### Step 3: Verify Setup (After Reboot)
|
||||
|
||||
```bash
|
||||
cd /mnt/shared/DEV/repos/d-popov.com/scripts/portainer-compose-stacks/windows
|
||||
./verify-gpu-passthrough.sh
|
||||
```
|
||||
|
||||
Expected output:
|
||||
- ✓ IOMMU is enabled
|
||||
- ✓ vfio_pci module loaded
|
||||
- ✓ GPU bound to vfio-pci
|
||||
- ✓ Audio bound to vfio-pci
|
||||
- ✓ /dev/vfio/vfio exists
|
||||
|
||||
### Step 4: Start Windows Container
|
||||
|
||||
```bash
|
||||
cd /mnt/shared/DEV/repos/d-popov.com/scripts/portainer-compose-stacks/windows
|
||||
docker-compose down # Stop if running
|
||||
docker-compose up -d
|
||||
```
|
||||
|
||||
### Step 5: Install AMD Drivers in Windows
|
||||
|
||||
1. Connect to Windows via RDP: `localhost:3389`
|
||||
2. Open Device Manager
|
||||
3. You should see "AMD Display Adapter" (may show with warning)
|
||||
4. Download AMD Radeon drivers for Windows 11
|
||||
5. Install the drivers
|
||||
6. Reboot Windows
|
||||
7. Verify GPU in Task Manager → Performance → GPU
|
||||
|
||||
## Docker Compose Configuration
|
||||
|
||||
The configuration includes:
|
||||
|
||||
```yaml
|
||||
environment:
|
||||
GPU: "Y"
|
||||
ARGUMENTS: "-device vfio-pci,host=c5:00.0,addr=0x02,multifunction=on -device vfio-pci,host=c5:00.1,addr=0x02.1"
|
||||
devices:
|
||||
- /dev/vfio/vfio
|
||||
```
|
||||
|
||||
This passes through:
|
||||
- **c5:00.0**: AMD GPU
|
||||
- **c5:00.1**: HDMI Audio
|
||||
- **addr=0x02**: Virtual PCI slot in guest
|
||||
- **multifunction=on**: Allows multiple functions on same slot
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### GPU still shows VirtIO after reboot
|
||||
|
||||
Check if GPU is bound to vfio-pci:
|
||||
```bash
|
||||
lspci -nnk -s c5:00.0
|
||||
```
|
||||
|
||||
Should show: `Kernel driver in use: vfio-pci`
|
||||
|
||||
If not, manually bind:
|
||||
```bash
|
||||
echo "0000:c5:00.0" | sudo tee /sys/bus/pci/drivers/amdgpu/unbind
|
||||
echo "1002 1586" | sudo tee /sys/bus/pci/drivers/vfio-pci/new_id
|
||||
```
|
||||
|
||||
### IOMMU not enabled after reboot
|
||||
|
||||
Check kernel parameters:
|
||||
```bash
|
||||
cat /proc/cmdline | grep iommu
|
||||
```
|
||||
|
||||
Should show: `amd_iommu=on iommu=pt`
|
||||
|
||||
If not present:
|
||||
```bash
|
||||
sudo nano /etc/default/grub
|
||||
# Add to GRUB_CMDLINE_LINUX_DEFAULT: amd_iommu=on iommu=pt
|
||||
sudo update-grub
|
||||
sudo reboot
|
||||
```
|
||||
|
||||
### Container fails to start
|
||||
|
||||
Check logs:
|
||||
```bash
|
||||
docker logs windows
|
||||
```
|
||||
|
||||
Common issues:
|
||||
- VFIO device not found: Run verification script
|
||||
- Permission denied: Ensure container is `privileged: true`
|
||||
- Device busy: Another driver may be using the GPU
|
||||
|
||||
### GPU not detected in Windows
|
||||
|
||||
1. Check Device Manager for unknown devices
|
||||
2. Try installing AMD Chipset drivers first
|
||||
3. Use AMD Auto-Detect tool for driver installation
|
||||
4. Check Windows Event Viewer for driver errors
|
||||
|
||||
## Performance Notes
|
||||
|
||||
- **Full GPU acceleration**: Direct PCI passthrough provides near-native performance
|
||||
- **VRAM**: Windows will see the full iGPU VRAM allocation
|
||||
- **Display output**: Use RDP/VNC (no physical display from container)
|
||||
- **3D acceleration**: Fully supported (DirectX, OpenGL, Vulkan)
|
||||
|
||||
## Limitations
|
||||
|
||||
- Host cannot use the iGPU while passed through to the container
|
||||
- Physical display outputs from the GPU won't work (headless only)
|
||||
- USB devices may need separate passthrough configuration
|
||||
- Some GPU features may require CPU pinning for best performance
|
||||
|
||||
## Files Modified
|
||||
|
||||
- `/etc/default/grub` - IOMMU kernel parameters
|
||||
- `/etc/modprobe.d/vfio.conf` - VFIO driver binding
|
||||
- `/etc/initramfs-tools/modules` - VFIO modules in initramfs
|
||||
- `docker-compose.yml` - PCI passthrough arguments
|
||||
|
||||
## Reverting Changes
|
||||
|
||||
To restore GPU to host:
|
||||
|
||||
1. Remove VFIO configuration:
|
||||
```bash
|
||||
sudo rm /etc/modprobe.d/vfio.conf
|
||||
```
|
||||
|
||||
2. Edit GRUB to remove `vfio-pci.ids=...`:
|
||||
```bash
|
||||
sudo nano /etc/default/grub
|
||||
sudo update-grub
|
||||
```
|
||||
|
||||
3. Update initramfs and reboot:
|
||||
```bash
|
||||
sudo update-initramfs -u
|
||||
sudo reboot
|
||||
```
|
||||
|
||||
## References
|
||||
|
||||
- [dockurr/windows](https://github.com/dockur/windows) - Windows container image
|
||||
- [AMD GPU Passthrough Guide](https://wiki.archlinux.org/title/PCI_passthrough_via_OVMF)
|
||||
- [VFIO Documentation](https://www.kernel.org/doc/html/latest/driver-api/vfio.html)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user