| From 927cf082463ae442014d8a34195010ce2ab7f708 Mon Sep 17 00:00:00 2001 |
| From: Rui Guo <firemeteor@users.sourceforge.net> |
| Date: Wed, 19 Jun 2013 21:10:23 +0800 |
| Subject: drm/i915: Fix PCH detect with multiple ISA bridges in VM |
| |
| In some virtualized environments (e.g. XEN), there is irrelevant ISA bridge in |
| the system. To work reliably, we should scan trhough all the ISA bridge |
| devices and check for the first match, instead of only checking the first one. |
| |
| Signed-off-by: Rui Guo <firemeteor@users.sourceforge.net> |
| [danvet: Fixup conflict with the num_pch_pll removal. And add |
| subsystem header to the commit message headline.] |
| Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch> |
| |
| (cherry picked from commit 6a9c4b35e6696a63805b6da5e4889c6986e9ee1b) |
| Signed-off-by: Darren Hart <dvhart@linux.intel.com> |
| --- |
| drivers/gpu/drm/i915/i915_drv.c | 18 ++++++++++++++++-- |
| 1 file changed, 16 insertions(+), 2 deletions(-) |
| |
| diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c |
| index b255b0bb0953..27a8bedd9156 100644 |
| --- a/drivers/gpu/drm/i915/i915_drv.c |
| +++ b/drivers/gpu/drm/i915/i915_drv.c |
| @@ -465,9 +465,15 @@ void intel_detect_pch(struct drm_device *dev) |
| * make graphics device passthrough work easy for VMM, that only |
| * need to expose ISA bridge to let driver know the real hardware |
| * underneath. This is a requirement from virtualization team. |
| + * |
| + * In some virtualized environments (e.g. XEN), there is irrelevant |
| + * ISA bridge in the system. To work reliably, we should scan trhough |
| + * all the ISA bridge devices and check for the first match, instead |
| + * of only checking the first one. |
| */ |
| pch = pci_get_class(PCI_CLASS_BRIDGE_ISA << 8, NULL); |
| - if (pch) { |
| + while (pch) { |
| + struct pci_dev *curr = pch; |
| if (pch->vendor == PCI_VENDOR_ID_INTEL) { |
| unsigned short id; |
| id = pch->device & INTEL_PCH_DEVICE_ID_MASK; |
| @@ -496,10 +502,18 @@ void intel_detect_pch(struct drm_device *dev) |
| DRM_DEBUG_KMS("Found LynxPoint LP PCH\n"); |
| WARN_ON(!IS_HASWELL(dev)); |
| WARN_ON(!IS_ULT(dev)); |
| + } else { |
| + goto check_next; |
| } |
| + pci_dev_put(pch); |
| + break; |
| } |
| - pci_dev_put(pch); |
| +check_next: |
| + pch = pci_get_class(PCI_CLASS_BRIDGE_ISA << 8, curr); |
| + pci_dev_put(curr); |
| } |
| + if (!pch) |
| + DRM_DEBUG_KMS("No PCH found?\n"); |
| } |
| |
| bool i915_semaphore_is_enabled(struct drm_device *dev) |
| -- |
| 1.8.5.rc3 |
| |