| From 18436afdc11a00ac881990b454cfb2eae81d6003 Mon Sep 17 00:00:00 2001 |
| From: David Woodhouse <David.Woodhouse@intel.com> |
| Date: Wed, 25 Mar 2015 15:05:47 +0000 |
| Subject: iommu/vt-d: Allow RMRR on graphics devices too |
| |
| From: David Woodhouse <David.Woodhouse@intel.com> |
| |
| commit 18436afdc11a00ac881990b454cfb2eae81d6003 upstream. |
| |
| Commit c875d2c1 ("iommu/vt-d: Exclude devices using RMRRs from IOMMU API |
| domains") prevents certain options for devices with RMRRs. This even |
| prevents those devices from getting a 1:1 mapping with 'iommu=pt', |
| because we don't have the code to handle *preserving* the RMRR regions |
| when moving the device between domains. |
| |
| There's already an exclusion for USB devices, because we know the only |
| reason for RMRRs there is a misguided desire to keep legacy |
| keyboard/mouse emulation running in some theoretical OS which doesn't |
| have support for USB in its own right... but which *does* enable the |
| IOMMU. |
| |
| Add an exclusion for graphics devices too, so that 'iommu=pt' works |
| there. We should be able to successfully assign graphics devices to |
| guests too, as long as the initial handling of stolen memory is |
| reconfigured appropriately. This has certainly worked in the past. |
| |
| Signed-off-by: David Woodhouse <David.Woodhouse@intel.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/iommu/intel-iommu.c | 7 ++++++- |
| 1 file changed, 6 insertions(+), 1 deletion(-) |
| |
| --- a/drivers/iommu/intel-iommu.c |
| +++ b/drivers/iommu/intel-iommu.c |
| @@ -50,6 +50,7 @@ |
| #define CONTEXT_SIZE VTD_PAGE_SIZE |
| |
| #define IS_GFX_DEVICE(pdev) ((pdev->class >> 16) == PCI_BASE_CLASS_DISPLAY) |
| +#define IS_USB_DEVICE(pdev) ((pdev->class >> 8) == PCI_CLASS_SERIAL_USB) |
| #define IS_ISA_DEVICE(pdev) ((pdev->class >> 8) == PCI_CLASS_BRIDGE_ISA) |
| #define IS_AZALIA(pdev) ((pdev)->vendor == 0x8086 && (pdev)->device == 0x3a3e) |
| |
| @@ -2554,6 +2555,10 @@ static bool device_has_rmrr(struct devic |
| * In both cases we assume that PCI USB devices with RMRRs have them largely |
| * for historical reasons and that the RMRR space is not actively used post |
| * boot. This exclusion may change if vendors begin to abuse it. |
| + * |
| + * The same exception is made for graphics devices, with the requirement that |
| + * any use of the RMRR regions will be torn down before assigning the device |
| + * to a guest. |
| */ |
| static bool device_is_rmrr_locked(struct device *dev) |
| { |
| @@ -2563,7 +2568,7 @@ static bool device_is_rmrr_locked(struct |
| if (dev_is_pci(dev)) { |
| struct pci_dev *pdev = to_pci_dev(dev); |
| |
| - if ((pdev->class >> 8) == PCI_CLASS_SERIAL_USB) |
| + if (IS_USB_DEVICE(pdev) || IS_GFX_DEVICE(pdev)) |
| return false; |
| } |
| |