vfio-pci: Add support for VGA region access
PCI defines display class VGA regions at I/O port address 0x3b0, 0x3c0 and MMIO address 0xa0000. As these are non-overlapping, we can ignore the I/O port vs MMIO difference and expose them both in a single region. We make use of the VGA arbiter around each access to configure chipset access as necessary. Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
This commit is contained in:
@@ -84,6 +84,11 @@ static int vfio_pci_enable(struct vfio_pci_device *vdev)
|
||||
} else
|
||||
vdev->msix_bar = 0xFF;
|
||||
|
||||
#ifdef CONFIG_VFIO_PCI_VGA
|
||||
if ((pdev->class >> 8) == PCI_CLASS_DISPLAY_VGA)
|
||||
vdev->has_vga = true;
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -285,6 +290,16 @@ static long vfio_pci_ioctl(void *device_data,
|
||||
info.flags = VFIO_REGION_INFO_FLAG_READ;
|
||||
break;
|
||||
}
|
||||
case VFIO_PCI_VGA_REGION_INDEX:
|
||||
if (!vdev->has_vga)
|
||||
return -EINVAL;
|
||||
|
||||
info.offset = VFIO_PCI_INDEX_TO_OFFSET(info.index);
|
||||
info.size = 0xc0000;
|
||||
info.flags = VFIO_REGION_INFO_FLAG_READ |
|
||||
VFIO_REGION_INFO_FLAG_WRITE;
|
||||
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
@@ -386,6 +401,9 @@ static ssize_t vfio_pci_rw(void *device_data, char __user *buf,
|
||||
|
||||
case VFIO_PCI_BAR0_REGION_INDEX ... VFIO_PCI_BAR5_REGION_INDEX:
|
||||
return vfio_pci_bar_rw(vdev, buf, count, ppos, iswrite);
|
||||
|
||||
case VFIO_PCI_VGA_REGION_INDEX:
|
||||
return vfio_pci_vga_rw(vdev, buf, count, ppos, iswrite);
|
||||
}
|
||||
|
||||
return -EINVAL;
|
||||
|
Reference in New Issue
Block a user