From: G.R Date: Thu, 25 Jul 2013 08:11:55 +0000 (+0000) Subject: passthrough: Correctly expose PCH ISA bridge for IGD passthrough X-Git-Tag: xen-4.4.0-rc1~4 X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=73c4ad5a3d065267b878c8ae31ff0b4833f093e4;p=qemu-xen-4.5-testing.git passthrough: Correctly expose PCH ISA bridge for IGD passthrough The i915 driver probes chip version through PCH ISA bridge device / vendor ID. Previously, the PCH ISA bridge is exposed as PCI-PCI bridge in qemu-xen-trad, which breaks the assumption of the driver. This change fixes the issue by correctly exposing the ISA bridge to domU. Signed-off-by: Rui Guo Tested-by: Rui Guo Acked-by: Stefano Stabellini Acked-by: Jan Beulich --- diff --git a/hw/pci.c b/hw/pci.c index f051de169..c4232856f 100644 --- a/hw/pci.c +++ b/hw/pci.c @@ -938,6 +938,16 @@ PCIBus *pci_bridge_init(PCIBus *bus, int devfn, uint16_t vid, uint16_t did, return s->bus; } +PCIBus *pci_isa_bridge_init(PCIBus *bus, int devfn, uint16_t vid, uint16_t did, + uint8_t rid, pci_map_irq_fn map_irq, const char *name) +{ + PCIBus *s = pci_bridge_init(bus, devfn, vid, did, rid, map_irq, name); + + pci_config_set_class(s->parent_dev->config, PCI_CLASS_BRIDGE_ISA); + s->parent_dev->config[PCI_HEADER_TYPE] = 0x80; + return s; +} + int pt_chk_bar_overlap(PCIBus *bus, int devfn, uint32_t addr, uint32_t size, uint8_t type) { diff --git a/hw/pci.h b/hw/pci.h index edc58b666..cacbdd280 100644 --- a/hw/pci.h +++ b/hw/pci.h @@ -271,6 +271,9 @@ void pci_info(void); PCIBus *pci_bridge_init(PCIBus *bus, int devfn, uint16_t vid, uint16_t did, uint8_t rid, pci_map_irq_fn map_irq, const char *name); +PCIBus *pci_isa_bridge_init(PCIBus *bus, int devfn, uint16_t vid, uint16_t did, + uint8_t rid, pci_map_irq_fn map_irq, const char *name); + #define NR_PCI_FUNC 8 #define NR_PCI_DEV 32 #define NR_PCI_DEVFN (NR_PCI_FUNC * NR_PCI_DEV) diff --git a/hw/pt-graphics.c b/hw/pt-graphics.c index c6f886958..7302b25d0 100644 --- a/hw/pt-graphics.c +++ b/hw/pt-graphics.c @@ -3,6 +3,7 @@ */ #include "pass-through.h" +#include "pci.h" #include "pci/header.h" #include "pci/pci.h" @@ -40,9 +41,11 @@ void intel_pch_init(PCIBus *bus) did = pt_pci_host_read(pci_dev_1f, PCI_DEVICE_ID, 2); rid = pt_pci_host_read(pci_dev_1f, PCI_REVISION, 1); - if ( vid == PCI_VENDOR_ID_INTEL ) - pci_bridge_init(bus, PCI_DEVFN(0x1f, 0), vid, did, rid, - pch_map_irq, "intel_bridge_1f"); + if (vid == PCI_VENDOR_ID_INTEL) { + pci_isa_bridge_init(bus, PCI_DEVFN(0x1f, 0), vid, did, rid, + pch_map_irq, "intel_bridge_1f"); + + } } uint32_t igd_read_opregion(struct pt_dev *pci_dev)