xen: add Intel IGD passthrough support
v6 cover xen: add Intel IGD passthrough support
Sorry for this so long delay to address this series since other things occupied my most time.
Michael,
You carried some patches previously on your branch for a while,
i440fx: make types configurable at run-time
pc_init1: pass parameters just with types xen:hw:pci-host:piix: create host bridge to passthrough
qom-test: blacklist xenigd
xen:hw:i386:pc_piix: introduce new machine for IGD passthrough
But now V6 just needs fist two and I also include them again here. So please drop others, and thanks a lot.
v6:
* Drop introducing a new machine specific to IGD passthrough
* Try to share some codes from KVM stuff in qemu to retrive VGA BIOS
* Currently IGD drivers always need to access PCH by 1f.0. But we don't want to poke that directly to get ID, and although in real world different GPU should have different PCH. But actually the different PCH DIDs likely map to different PCH SKUs. We do the same thing for the GPU. For PCH, the different SKUs are going to be all the same silicon design and implementation, just different features turn on and off with fuses. The SW interfaces should be consistent across all SKUs in a given family (eg LPT). But just same features may not be supported.
Most of these different PCH features probably don't matter to the Gfx driver, but obviously any difference in display port connections will so it should be fine with any PCH in case of passthrough.
So currently use one PCH version, 0x8c4e, to cover all HSW(Haswell) scenarios, 0x9cc3 for BDW(Broadwell).
* Drop igd write ops since its fine to emulate that, and we also shrink those igd read ops as necessary.
* Rebase and cleanup all patches.
v5:
* Simplify to make sure its really inherited from the standard one in patch #3
* Then drop the original patch #3
v4:
* Rebase on latest tree
* Drop patch #2
* Regenerate patches after Michael introduce patch #1
* We need to use this pci_type as a index to reuse I440FX_PCI_DEVICE()
* Test: boot with a preinstalled winxp ./i386-softmmu/qemu-system-i386 -hda winxp-32.img -m 2560 -boot c -machine pc
v3:
* Drop patch #4
* Add one patch #1 from Michael
* Rebase
* In./i386-softmmu/qemu-system-i386 -hda test.img -m 2560 -boot c -machine pc
v2:
* Fix some coding style
* New patch to separate i440fx_init
* Just add prefix with XEN_IGD_PASSTHROUGH/xen_igd_passthrough
* Based on patch #2 to regenerate
* Unify prefix with XEN_IGD_PASSTHROUGH/xen_igd_passthrough like patch #3
* Test: boot with a preinstalled ubuntu 14.04 ./i386-softmmu/qemu-system-i386 -hda test.img -m 2560 -boot c -machine pc
As we discussed we need to create a separate machine to support current IGD passthrough.
----------------------------------------------------------------
Michael S. Tsirkin (1):
i440fx: make types configurable at run-time
Tiejun Chen (9):
pc_init1: pass parameters just with types
piix: create host bridge to passthrough
hw/pci-assign: split pci-assign.c
xen, gfx passthrough: basic graphics passthrough support xen, gfx passthrough: retrieve VGA BIOS to work
xen, gfx passthrough: register a isa bridge
xen, gfx passthrough: support Intel IGD passthrough with VT-D xen, gfx passthrough: register host bridge specific to passthrough xen, gfx passthrough: add opregion mapping
hw/i386/Makefile.objs | 1 + hw/i386/kvm/pci-assign.c | 82 +++---------------------------- hw/i386/pc_piix.c | 36 +++++++++++--- hw/i386/pci-assign-load-rom.c | 93 +++++++++++++++++++++++++++++++++++ hw/pci-host/piix.c | 28 +++++++++-- hw/xen/Makefile.objs | 1 + hw/xen/xen-host-pci-device.c | 5 ++ hw/xen/xen-host-pci-device.h | 1 + hw/xen/xen_pt.c | 140 +++++++++++++++++++++++++++++++++++++++++++++++++++++ hw/xen/xen_pt.h | 22 ++++++++- hw/xen/xen_pt_config_init.c | 52 +++++++++++++++++++- hw/xen/xen_pt_graphics.c | 344 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ include/hw/i386/pc.h | 8 ++- include/hw/pci/pci-assign.h | 27 +++++++++++ qemu-options.hx | 9 ++++ vl.c | 10 ++++ 16 files changed, 767 insertions(+), 92 deletions(-) create mode 100644 hw/i386/pci-assign-load-rom.c create mode 100644 hw/xen/xen_pt_graphics.c create mode 100644 include/hw/pci/pci-assign.h
Thanks
Tiejun
PATCH v6 1/10 i440fx: make types configurable at run-time
From: "Michael S. Tsirkin" <[email protected]>
Xen wants to supply a different pci and host devices, inheriting i440fx devices. Make types configurable.
--- hw/i386/pc_piix.c | 4 +++- hw/pci-host/piix.c | 9 ++++----- include/hw/i386/pc.h | 6 +++++- 3 files changed, 12 insertions(+), 7 deletions(-)
hw/i386/pc_piix.c +3 -1
@@ -200,7 +200,9 @@ static void pc_init1(MachineState *machine, }if (pci_enabled) { - pci_bus = i440fx_init(&i440fx_state, &piix3_devfn, &isa_bus, gsi, + pci_bus = i440fx_init(TYPE_I440FX_PCI_HOST_BRIDGE, + TYPE_I440FX_PCI_DEVICE, + &i440fx_state, &piix3_devfn, &isa_bus, gsi, system_memory, system_io, machine->ram_size, below_4g_mem_size, above_4g_mem_size,
hw/pci-host/piix.c +4 -5
@@ -40,7 +40,6 @@* http://download.intel.com/design/chipsets/datashts/29054901.pdf */ -#define TYPE_I440FX_PCI_HOST_BRIDGE "i440FX-pcihost"#define I440FX_PCI_HOST_BRIDGE (obj) \ OBJECT_CHECK(I440FXState, (obj), TYPE_I440FX_PCI_HOST_BRIDGE)
@@ -91,7 +90,6 @@ typedef struct PIIX3State {MemoryRegion rcr_mem; } PIIX3State; -#define TYPE_I440FX_PCI_DEVICE "i440FX"#define I440FX_PCI_DEVICE (obj) \ OBJECT_CHECK(PCII440FXState, (obj), TYPE_I440FX_PCI_DEVICE)
@@ -305,7 +303,8 @@ static int i440fx_initfn(PCIDevice *dev)return 0 ; } -PCIBus *i440fx_init(PCII440FXState **pi440fx_state, +PCIBus *i440fx_init(const char *host_type, const char *pci_type, + PCII440FXState **pi440fx_state, int *piix3_devfn, ISABus **isa_bus, qemu_irq *pic, MemoryRegion *address_space_mem,
@@ -325,7 +324,7 @@ PCIBus *i440fx_init(PCII440FXState **pi440fx_state,unsigned i;I440FXState *i440fx; - dev =qdev_create (NULL ,TYPE_I440FX_PCI_HOST_BRIDGE ); + dev =qdev_create (NULL , host_type); s =PCI_HOST_BRIDGE (dev); b =pci_bus_new (dev,NULL , pci_address_space, address_space_io,0 ,TYPE_PCI_BUS );
@@ -333,7 +332,7 @@ PCIBus *i440fx_init(PCII440FXState **pi440fx_state,object_property_add_child (qdev_get_machine (),"i440fx" ,OBJECT (dev),NULL );qdev_init_nofail (dev); - d =pci_create_simple (b,0 ,TYPE_I440FX_PCI_DEVICE ); + d =pci_create_simple (b,0 , pci_type); *pi440fx_state =I440FX_PCI_DEVICE (d); f = *pi440fx_state; f->system_memory = address_space_mem;
include/hw/i386/pc.h +5 -1
@@ -244,7 +244,11 @@ extern int no_hpet;struct PCII440FXState ;typedef struct PCII440FXState PCII440FXState ; -PCIBus *i440fx_init(PCII440FXState **pi440fx_state, int *piix_devfn, +#define TYPE_I440FX_PCI_HOST_BRIDGE "i440FX-pcihost" +#define TYPE_I440FX_PCI_DEVICE "i440FX" + +PCIBus *i440fx_init(const char *host_type, const char *pci_type, + PCII440FXState **pi440fx_state, int *piix_devfn, ISABus **isa_bus, qemu_irq *pic, MemoryRegion *address_space_mem, MemoryRegion *address_space_io,
Signature · 1 line
1.9.1
Re: [Qemu-devel] [v6][PATCH 01/10] i440fx: make types configurable at run-time
Quoted 4 lines · Tiejun Chen
From: "Michael S. Tsirkin" <[email protected]>
Xen wants to supply a different pci and host devices, inheriting i440fx devices. Make types configurable.
Description is misleading, this isn't about xen but about IGD passthrough. Guess kvm needs this too once kvmgt lands upstream.
Otherwise looks sane to me.
cheers,
Gerd
Re: [Qemu-devel] [v6][PATCH 01/10] i440fx: make types configurable at run-time
Quoted 7 lines · Gerd Hoffmann
Quoted 4 lines · Tiejun Chen
From: "Michael S. Tsirkin" <[email protected]>
Xen wants to supply a different pci and host devices, inheriting i440fx devices. Make types configurable.
Description is misleading, this isn't about xen but about IGD
Its about IGD passthrough in Xen side.
Quoted 2 lines
passthrough. Guess kvm needs this too once kvmgt lands upstream.
But I'm not sure if KvmGT is really going to be this so just CCed Jike who are focusing on KvmGT currently, and he also promised to have a closer loot at this.
Thanks
Tiejun
Quoted 7 lines
Otherwise looks sane to me.
cheers,
Gerd
Re: [Qemu-devel] [v6][PATCH 01/10] i440fx: make types configurable at run-time
Quoted 10 lines · Tiejun
Quoted 7 lines · Gerd Hoffmann
Quoted 4 lines · Tiejun Chen
From: "Michael S. Tsirkin" <[email protected]>
Xen wants to supply a different pci and host devices, inheriting i440fx devices. Make types configurable.
Description is misleading, this isn't about xen but about IGD
Its about IGD passthrough in Xen side.
As far I can see the only really xen specific stuff here is the pci pass-through bits, i.e. how we handle the IGD device itself.
The northbridge & isa-bridge emulation extensions needed for IGD should be pretty much common for IGD passthough on xen, IGD passthrough on kvm (vfio) and IGD virtualization (xengt+kvmgt).
cheers,
Gerd
Re: [Qemu-devel] [v6][PATCH 01/10] i440fx: make types configurable at run-time
Quoted 10 lines · Gerd Hoffmann
Quoted 9 lines · Tiejun
Quoted 7 lines · Gerd Hoffmann
Quoted 4 lines · Tiejun Chen
From: "Michael S. Tsirkin" <[email protected]>
Xen wants to supply a different pci and host devices, inheriting i440fx devices. Make types configurable.
Description is misleading, this isn't about xen but about IGD
Quoted 8 lines
Quoted 1 line
Its about IGD passthrough in Xen side.
As far I can see the only really xen specific stuff here is the pci pass-through bits, i.e. how we handle the IGD device itself.
The northbridge & isa-bridge emulation extensions needed for IGD should be pretty much common for IGD passthough on xen, IGD passthrough on kvm (vfio) and IGD virtualization (xengt+kvmgt).
This is exactly what I proposed in another thread :)
Quoted 4 lines
cheers,
Gerd
--
Thanks,
Jike
Re: [Qemu-devel] [v6][PATCH 01/10] i440fx: make types configurable at run-time
In reply to Gerd HoffmannQuoted 9 lines · Gerd Hoffmann
Quoted 4 lines · Tiejun Chen
From: "Michael S. Tsirkin" <[email protected]>
Xen wants to supply a different pci and host devices, inheriting i440fx devices. Make types configurable.
Description is misleading, this isn't about xen but about IGD passthrough. Guess kvm needs this too once kvmgt lands upstream.
So just rephrase this as follows:
i440fx: make types configurable at run-time
IGD passthrough wants to supply a different pci and host devices, inheriting i440fx devices. Make types configurable.
Thanks
Tiejun
PATCH v6 2/10 pc_init1: pass parameters just with types
In reply to Tiejun ChenPass types to configure pc_init1().
--- hw/i386/pc_piix.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-)
hw/i386/pc_piix.c +11 -6
@@ -74,7 +74,9 @@ static bool has_reserved_memory = true;/* PC hardware initialisation */ static void pc_init1 (MachineState *machine,int pci_enabled, -int kvmclock_enabled) +int kvmclock_enabled, +const char *host_type, +const char *pci_type) {PCMachineState *pc_machine =PC_MACHINE (machine);MemoryRegion *system_memory =get_system_memory ();
@@ -200,8 +202,8 @@ static void pc_init1(MachineState *machine, }if (pci_enabled) { - pci_bus = i440fx_init(TYPE_I440FX_PCI_HOST_BRIDGE, - TYPE_I440FX_PCI_DEVICE, + pci_bus = i440fx_init(host_type, + pci_type, &i440fx_state, &piix3_devfn, &isa_bus, gsi, system_memory, system_io, machine->ram_size, below_4g_mem_size,
@@ -307,7 +309,8 @@ static void pc_init1(MachineState *machine,static void pc_init_pci (MachineState *machine) { -pc_init1 (machine,1 ,1 ); +pc_init1 (machine,1 ,1 ,TYPE_I440FX_PCI_HOST_BRIDGE , +TYPE_I440FX_PCI_DEVICE ); }static void pc_compat_2_2 (MachineState *machine)
@@ -470,7 +473,8 @@ static void pc_init_pci_1_2(MachineState *machine)static void pc_init_pci_no_kvmclock (MachineState *machine) {pc_compat_1_2 (machine); -pc_init1 (machine,1 ,0 ); +pc_init1 (machine,1 ,0 ,TYPE_I440FX_PCI_HOST_BRIDGE , +TYPE_I440FX_PCI_DEVICE ); }static void pc_init_isa (MachineState *machine)
@@ -487,7 +491,8 @@ static void pc_init_isa(MachineState *machine) }x86_cpu_compat_kvm_no_autoenable (FEAT_KVM ,KVM_FEATURE_PV_EOI );enable_compat_apic_id_mode (); -pc_init1 (machine,0 ,1 ); +pc_init1 (machine,0 ,1 ,TYPE_I440FX_PCI_HOST_BRIDGE , +TYPE_I440FX_PCI_DEVICE ); }#ifdef CONFIG_XEN
Signature · 1 line
1.9.1
PATCH v6 3/10 piix: create host bridge to passthrough
In reply to Tiejun ChenImplement a pci host bridge specific to passthrough. Actually this just inherits the standard one.
--- hw/pci-host/piix.c | 16 ++++++++++++++++ include/hw/i386/pc.h | 2 ++ 2 files changed, 18 insertions(+)
hw/pci-host/piix.c +16 -0
@@ -729,6 +729,21 @@ static const TypeInfo i440fx_info = { .class_init = i440fx_class_init, }; +static void xen_igd_passthrough_i440fx_class_init (ObjectClass *klass, +void *data) +{ +DeviceClass *dc =DEVICE_CLASS (klass); + + dc->desc ="IGD PT XEN Host bridge" ; +} + +static const TypeInfo xen_igd_passthrough_i440fx_info = { + .name =TYPE_XEN_IGD_PASSTHROUGH_I440FX_PCI_DEVICE , + .parent =TYPE_I440FX_PCI_DEVICE , + .instance_size =sizeof (PCII440FXState), + .class_init = xen_igd_passthrough_i440fx_class_init, +}; +static const char *i440fx_pcihost_root_bus_path (PCIHostState *host_bridge,PCIBus *rootbus) {
@@ -770,6 +785,7 @@ static const TypeInfo i440fx_pcihost_info = {static void i440fx_register_types (void ) {type_register_static (&i440fx_info); +type_register_static (&xen_igd_passthrough_i440fx_info);type_register_static (&piix3_info);type_register_static (&piix3_xen_info);type_register_static (&i440fx_pcihost_info);
include/hw/i386/pc.h +2 -0
@@ -247,6 +247,8 @@ typedef struct PCII440FXState PCII440FXState;#define TYPE_I440FX_PCI_HOST_BRIDGE "i440FX-pcihost"#define TYPE_I440FX_PCI_DEVICE "i440FX" +#define TYPE_XEN_IGD_PASSTHROUGH_I440FX_PCI_DEVICE "xen-igd-passthrough-i440FX" + PCIBus *i440fx_init(const char *host_type, const char *pci_type, PCII440FXState **pi440fx_state, int *piix_devfn, ISABus **isa_bus, qemu_irq *pic,
Signature · 1 line
1.9.1
Re: [Qemu-devel] [v6][PATCH 03/10] piix: create host bridge to passthrough
hw/pci-host/piix.c static const TypeInfo i440fx_info = { · line 738
Quoted 7 lines · Tiejun Chen
hw/pci-host/piix.c +7
-0+static void xen_igd_passthrough_i440fx_class_init (ObjectClass *klass, +void *data) +{ +DeviceClass *dc =DEVICE_CLASS (klass); + + dc->desc ="IGD PT XEN Host bridge" ; +}
IMO "xen" naming should go away here too.
cheers,
Gerd
Re: [Qemu-devel] [v6][PATCH 03/10] piix: create host bridge to passthrough
Quoted 11 lines · Gerd Hoffmann
hw/pci-host/piix.c static const TypeInfo i440fx_info = { · line 738
Quoted 7 lines · Tiejun Chen
hw/pci-host/piix.c +7
-0+static void xen_igd_passthrough_i440fx_class_init (ObjectClass *klass, +void *data) +{ +DeviceClass *dc =DEVICE_CLASS (klass); + + dc->desc ="IGD PT XEN Host bridge" ; +}IMO "xen" naming should go away here too.
Its easy to do but we need to wait KvmGT guys' response, so now it makes sense to leave "xen" as a prefix since this just work in xen side.
Thanks
Tiejun
Re: [Qemu-devel] [v6][PATCH 03/10] piix: create host bridge to passthrough
Quoted 12 lines · Tiejun
Quoted 11 lines · Gerd Hoffmann
hw/pci-host/piix.c static const TypeInfo i440fx_info = { · line 738
Quoted 7 lines · Tiejun Chen
hw/pci-host/piix.c +7
-0+static void xen_igd_passthrough_i440fx_class_init (ObjectClass *klass, +void *data) +{ +DeviceClass *dc =DEVICE_CLASS (klass); + + dc->desc ="IGD PT XEN Host bridge" ; +}IMO "xen" naming should go away here too.
I would agree with this.
In fact, this piece of code could possibly be used by:
a) IGD passthru for Xen and KVM, and/or:
b) IGD Mediated passthru for Xen and KVM, i.e. XenGT/KVMGT
So it looks better if have "xen" naming purged :)
Quoted 7 lines
Its easy to do but we need to wait KvmGT guys' response, so now it makes sense to leave "xen" as a prefix since this just work in xen side.
Thanks
Tiejun
--
Thanks,
Jike
Re: [Qemu-devel] [v6][PATCH 03/10] piix: create host bridge to passthrough
Quoted 14 lines · Jike Song
Quoted 12 lines · Tiejun
Quoted 11 lines · Gerd Hoffmann
hw/pci-host/piix.c static const TypeInfo i440fx_info = { · line 738
Quoted 7 lines · Tiejun Chen
hw/pci-host/piix.c +7
-0+static void xen_igd_passthrough_i440fx_class_init (ObjectClass *klass, +void *data) +{ +DeviceClass *dc =DEVICE_CLASS (klass); + + dc->desc ="IGD PT XEN Host bridge" ; +}IMO "xen" naming should go away here too.
Quoted 8 lines
I would agree with this.
In fact, this piece of code could possibly be used by:
a) IGD passthru for Xen and KVM, and/or:
b) IGD Mediated passthru for Xen and KVM, i.e. XenGT/KVMGTSo it looks better if have "xen" naming purged :)
Okay, I'll do this in next revision.
Thanks
Tiejun
Quoted 14 lines
Quoted 8 lines
Its easy to do but we need to wait KvmGT guys' response, so now it makes sense to leave "xen" as a prefix since this just work in xen side.
Thanks
Tiejun--
Thanks,
Jike
PATCH v6 4/10 hw/pci-assign: split pci-assign.c
In reply to Tiejun ChenWe will try to reuse assign_dev_load_option_rom in xen side, and especially its a good beginning to unify pci assign codes both on kvm and xen in the future.
--- hw/i386/Makefile.objs | 1 + hw/i386/kvm/pci-assign.c | 82 ++++---------------------------------- hw/i386/pci-assign-load-rom.c | 93 +++++++++++++++++++++++++++++++++++++++++++ include/hw/pci/pci-assign.h | 27 +++++++++++++ 4 files changed, 128 insertions(+), 75 deletions(-) create mode 100644 hw/i386/pci-assign-load-rom.c create mode 100644 include/hw/pci/pci-assign.h
hw/i386/Makefile.objs +1 -0
@@ -8,6 +8,7 @@ obj-$(CONFIG_XEN) += ../xenpv/ xen/ obj-y += kvmvapic.o obj-y += acpi-build.o obj-y += bios-linker-loader.o +obj-y += pci-assign-load-rom.o hw/i386/acpi-build.o: hw/i386/acpi-build.c hw/i386/acpi-dsdt.hex \ hw/i386/ssdt-proc.hex hw/i386/ssdt-pcihp.hex hw/i386/ssdt-misc.hex \ hw/i386/acpi-dsdt.hex hw/i386/q35-acpi-dsdt.hex \
hw/i386/kvm/pci-assign.c +7 -75
103 lines not on this page · raw message
hw/i386/pci-assign-load-rom.c new file +93 -0
93 lines not on this page · raw message
include/hw/pci/pci-assign.h new file +27 -0
@@ -0,0 +1,27 @@ +/* +* This work is licensed under the terms of the GNU GPL, version 2. See +* the COPYING file in the top-level directory. +* +* Just split from hw/i386/kvm/pci-assign.c. +*/ +#ifndef PCI_ASSIGN_H +#define PCI_ASSIGN_H + +#include "hw/pci/pci.h" + +//#define DEVICE_ASSIGNMENT_DEBUG + +#ifdef DEVICE_ASSIGNMENT_DEBUG +#define DEBUG (fmt, ...) \ + do { \ + fprintf(stderr, "%s: " fmt, __func__ , __VA_ARGS__); \ + } while (0) +#else +#define DEBUG (fmt, ...) +#endif + +void *pci_assign_dev_load_option_rom (PCIDevice *dev,struct Object *owner, +int *size,unsigned int domain, +unsigned int bus,unsigned int slot, +unsigned int function); +#endif /* PCI_ASSIGN_H */
Signature · 1 line
1.9.1
PATCH v6 5/10 xen, gfx passthrough: basic graphics passthrough support
In reply to Tiejun Chenbasic gfx passthrough support:
- add a vga type for gfx passthrough
- register/unregister legacy VGA I/O ports and MMIOs for passthrough GFX
--- hw/xen/Makefile.objs | 1 + hw/xen/xen-host-pci-device.c | 5 ++ hw/xen/xen-host-pci-device.h | 1 + hw/xen/xen_pt.c | 4 ++ hw/xen/xen_pt.h | 10 +++- hw/xen/xen_pt_graphics.c | 111 +++++++++++++++++++++++++++++++++++++++++++ qemu-options.hx | 9 ++++ vl.c | 10 ++++ 8 files changed, 150 insertions(+), 1 deletion(-) create mode 100644 hw/xen/xen_pt_graphics.c
hw/xen/Makefile.objs +1 -0
@@ -3,3 +3,4 @@ common-obj-$(CONFIG_XEN_BACKEND) += xen_backend.o xen_devconfig.o obj-$(CONFIG_XEN_PCI_PASSTHROUGH) += xen-host-pci-device.o obj-$(CONFIG_XEN_PCI_PASSTHROUGH) += xen_pt.o xen_pt_config_init.o xen_pt_msi.o +obj-$(CONFIG_XEN_PCI_PASSTHROUGH) += xen_pt.o xen_pt_config_init.o xen_pt_msi.o xen_pt_graphics.o
hw/xen/xen-host-pci-device.c +5 -0
@@ -376,6 +376,11 @@ int xen_host_pci_device_get(XenHostPCIDevice *d, uint16_t domain, goto error; } d->irq = v; + rc =xen_host_pci_get_hex_value (d,"class" , &v); +if (rc) { + goto error; + } + d->class_code = v; d->is_virtfn =xen_host_pci_dev_is_virtfn (d);return 0 ;
hw/xen/xen-host-pci-device.h +1 -0
@@ -25,6 +25,7 @@ typedef struct XenHostPCIDevice {uint16_t vendor_id;uint16_t device_id; +uint32_t class_code;int irq;XenHostPCIIORegion io_regions[PCI_NUM_REGIONS -1 ];
hw/xen/xen_pt.c +4 -0
@@ -450,6 +450,7 @@ static int xen_pt_register_regions(XenPCIPassthroughState *s) d->rom.size, d->rom.base_addr); } +xen_pt_register_vga_regions (d);return 0 ; }
@@ -748,6 +749,7 @@ out:static void xen_pt_unregister_device (PCIDevice *d) {XenPCIPassthroughState *s =DO_UPCAST (XenPCIPassthroughState, dev, d); +XenHostPCIDevice *host_dev = &s->real_device;uint8_t machine_irq = s->machine_irq;uint8_t intx =xen_pt_pci_intx (s);int rc;
@@ -791,6 +793,8 @@ static void xen_pt_unregister_device(PCIDevice *d)/* delete all emulated config registers */ xen_pt_config_delete (s); +xen_pt_unregister_vga_regions (host_dev); +memory_listener_unregister (&s->memory_listener);memory_listener_unregister (&s->io_listener);
hw/xen/xen_pt.h +9 -1
@@ -298,5 +298,13 @@ static inline bool xen_pt_has_msix_mapping(XenPCIPassthroughState *s, int bar) return s->msix && s->msix->bar_index == bar; } - +extern int xen_has_gfx_passthru; +static inline int is_igd_vga_passthrough (XenHostPCIDevice *dev) +{ +return (xen_has_gfx_passthru + && ((dev->class_code >>0x8 ) ==PCI_CLASS_DISPLAY_VGA )); +} +int xen_pt_register_vga_regions (XenHostPCIDevice *dev); +int xen_pt_unregister_vga_regions (XenHostPCIDevice *dev); +int xen_pt_setup_vga (XenPCIPassthroughState *s,XenHostPCIDevice *dev);#endif /* !XEN_PT_H */
hw/xen/xen_pt_graphics.c new file +111 -0
111 lines not on this page · raw message
qemu-options.hx +9 -0
@@ -1075,6 +1075,15 @@ STEXI Rotate graphical output some deg left (only PXA LCD). ETEXI +DEF("gfx_passthru", 0, QEMU_OPTION_gfx_passthru, + "-gfx_passthru enable Intel IGD passthrough by XEN\n", + QEMU_ARCH_ALL) +STEXI +@item -gfx_passthru +@findex -gfx_passthru +Enable Intel IGD passthrough by XEN +ETEXI + DEF("vga", HAS_ARG, QEMU_OPTION_vga, "-vga [std|cirrus|vmware|qxl|xenfb|tcx|cg3|none]\n" " select video card type\n", QEMU_ARCH_ALL)
vl.c +10 -0
@@ -1222,6 +1222,13 @@ static void configure_msg(QemuOpts *opts) enable_timestamp_msg =qemu_opt_get_bool (opts,"timestamp" , true); } +/* We still need this for compatibility with XEN. */ +int xen_has_gfx_passthru; +static void xen_gfx_passthru (const char *optarg) +{ + xen_has_gfx_passthru =1 ; +} +/***********************************************************/ /* USB devices */
@@ -3749,6 +3756,9 @@ int main(int argc, char **argv, char **envp)exit (1 ); }break ; +case QEMU_OPTION_gfx_passthru: +xen_gfx_passthru (optarg); +break ;default :os_parse_cmd_args (popt->index, optarg); }
Signature · 1 line
1.9.1
Re: [Qemu-devel] [v6][PATCH 05/10] xen, gfx passthrough: basic graphics passthrough support
qemu-options.hx STEXI · line 1085
Quoted 8 lines · Tiejun Chen
qemu-options.hx +8
-0+DEF("gfx_passthru", 0, QEMU_OPTION_gfx_passthru, + "-gfx_passthru enable Intel IGD passthrough by XEN\n", + QEMU_ARCH_ALL) +STEXI +@item -gfx_passthru +@findex -gfx_passthru +Enable Intel IGD passthrough by XEN +ETEXI
Make that a machine option, i.e. "-machine pc,igd-passthru=on"?
Again, most of this applies to kvmgt too, so I think the "xen" naming should go away here.
While talking about machine types: what about q35?
cheers,
Gerd
Re: [Qemu-devel] [v6][PATCH 05/10] xen, gfx passthrough: basic graphics passthrough support
Quoted 11 lines · Gerd Hoffmann
qemu-options.hx STEXI · line 1085
Quoted 8 lines · Tiejun Chen
qemu-options.hx +8
-0+DEF("gfx_passthru", 0, QEMU_OPTION_gfx_passthru, + "-gfx_passthru enable Intel IGD passthrough by XEN\n", + QEMU_ARCH_ALL) +STEXI +@item -gfx_passthru +@findex -gfx_passthru +Enable Intel IGD passthrough by XEN +ETEXIMake that a machine option, i.e. "-machine pc,igd-passthru=on"?
Yeah but I think we need "-machine xenfv,igd-passthru=on" here.
Thanks
Tiejun
Re: [Qemu-devel] [v6][PATCH 05/10] xen, gfx passthrough: basic graphics passthrough support
Quoted 13 lines · Tiejun
Quoted 11 lines · Gerd Hoffmann
qemu-options.hx STEXI · line 1085
Quoted 8 lines · Tiejun Chen
qemu-options.hx +8
-0+DEF("gfx_passthru", 0, QEMU_OPTION_gfx_passthru, + "-gfx_passthru enable Intel IGD passthrough by XEN\n", + QEMU_ARCH_ALL) +STEXI +@item -gfx_passthru +@findex -gfx_passthru +Enable Intel IGD passthrough by XEN +ETEXIMake that a machine option, i.e. "-machine pc,igd-passthru=on"?
Quoted 1 line
Yeah but I think we need "-machine xenfv,igd-passthru=on" here.
IIRC xen decided to stop using xenfv and use pc-$version instead (with $version being what was current at release time, 1.6 for xen 4.4 I think, to avoid surprises like the address space layout changes in more recent machine types).
cheers,
Gerd
Re: [Qemu-devel] [v6][PATCH 05/10] xen, gfx passthrough: basic graphics passthrough support
Quoted 14 lines · Gerd Hoffmann
Quoted 13 lines · Tiejun
Quoted 11 lines · Gerd Hoffmann
qemu-options.hx STEXI · line 1085
Quoted 8 lines · Tiejun Chen
qemu-options.hx +8
-0+DEF("gfx_passthru", 0, QEMU_OPTION_gfx_passthru, + "-gfx_passthru enable Intel IGD passthrough by XEN\n", + QEMU_ARCH_ALL) +STEXI +@item -gfx_passthru +@findex -gfx_passthru +Enable Intel IGD passthrough by XEN +ETEXIMake that a machine option, i.e. "-machine pc,igd-passthru=on"?
Quoted 7 lines
Quoted 1 line
Yeah but I think we need "-machine xenfv,igd-passthru=on" here.
IIRC xen decided to stop using xenfv and use pc-$version instead (with $version being what was current at release time, 1.6 for xen 4.4 I think, to avoid surprises like the address space layout changes in more recent machine types).
To be more exact, 'xen_platform_pci' should determine this at this point,
if (!libxl_defbool_val(b_info->u.hvm.xen_platform_pci)) {
/* Switching here to the machine "pc" which does not add
* the xen-platform device instead of the default "xenfv"
machine.
*/
machinearg = libxl__sprintf(gc, "pc,accel=xen");
} else {
machinearg = libxl__sprintf(gc, "xenfv");
}But you may remember, in our case we always set 'xen_platform_pci=0' since we need to release slot 2 for IGD. So finally we really go pc case.
Anyway this means something should be changed to pass such a new machine property in Xen side. And I'll send a patch to address this firstly, then go back here.
Thanks
Tiejun
PATCH v6 6/10 xen, gfx passthrough: retrieve VGA BIOS to work
In reply to Tiejun ChenNow we retrieve VGA bios like kvm stuff in qemu but we need to fix Device Identification in case if its not matched with the real IGD device since Seabios is always trying to compare this ID to work out VGA BIOS.
--- hw/xen/xen_pt.c | 10 ++++++ hw/xen/xen_pt.h | 5 +++ hw/xen/xen_pt_graphics.c | 79 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 94 insertions(+)
hw/xen/xen_pt.c +10 -0
@@ -672,6 +672,16 @@ static int xen_pt_initfn(PCIDevice *d) s->memory_listener = xen_pt_memory_listener; s->io_listener = xen_pt_io_listener; +/* Setup VGA bios for passthrough GFX */ +if ((s->real_device.domain ==0 ) && (s->real_device.bus ==0 ) && + (s->real_device.dev ==2 ) && (s->real_device.func ==0 )) { +if (xen_pt_setup_vga (s, &s->real_device) <0 ) { +XEN_PT_ERR (d,"Setup VGA BIOS of passthrough GFX failed!\n" ); +xen_host_pci_device_put (&s->real_device); +return -1 ; + } + } +/* Handle real device's MMIO/PIO BARs */ xen_pt_register_regions (s);
hw/xen/xen_pt.h +5 -0
@@ -298,6 +298,11 @@ static inline bool xen_pt_has_msix_mapping(XenPCIPassthroughState *s, int bar)return s->msix && s->msix->bar_index == bar; } +extern void *pci_assign_dev_load_option_rom (PCIDevice *dev, +struct Object *owner,int *size, +unsigned int domain, +unsigned int bus,unsigned int slot, +unsigned int function);extern int xen_has_gfx_passthru;static inline int is_igd_vga_passthrough (XenHostPCIDevice *dev) {
hw/xen/xen_pt_graphics.c +79 -0
82 lines not on this page · raw message
Signature · 1 line
1.9.1
PATCH v6 7/10 xen, gfx passthrough: register a isa bridge
In reply to Tiejun ChenCurrently IGD drivers always need to access PCH by 1f.0. But we don't want to poke that directly to get ID, and although in real world different GPU should have different PCH. But actually the different PCH DIDs likely map to different PCH SKUs. We do the same thing for the GPU. For PCH, the different SKUs are going to be all the same silicon design and implementation, just different features turn on and off with fuses. The SW interfaces should be consistent across all SKUs in a given family (eg LPT). But just same features may not be supported.
Most of these different PCH features probably don't matter to the Gfx driver, but obviously any difference in display port connections will so it should be fine with any PCH in case of passthrough.
So currently use one PCH version, 0x8c4e, to cover all HSW(Haswell) scenarios, 0x9cc3 for BDW(Broadwell).
--- hw/xen/xen_pt.c | 126 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 126 insertions(+)
hw/xen/xen_pt.c +126 -0
@@ -632,6 +632,129 @@ static const MemoryListener xen_pt_io_listener = { .priority = 10, }; +typedef struct { +uint16_t gpu_device_id; +uint16_t pch_device_id; +uint8_t pch_revision_id; +}XenIGDDeviceIDInfo ; + +/* In real world different GPU should have different PCH. But actually +* the different PCH DIDs likely map to different PCH SKUs. We do the +* same thing for the GPU. For PCH, the different SKUs are going to be +* all the same silicon design and implementation, just different +* features turn on and off with fuses. The SW interfaces should be +* consistent across all SKUs in a given family (eg LPT). But just same +* features may not be supported. +* +* Most of these different PCH features probably don't matter to the +* Gfx driver, but obviously any difference in display port connections +* will so it should be fine with any PCH in case of passthrough. +* +* So currently use one PCH version, 0x8c4e, to cover all HSW(Haswell) +* scenarios, 0x9cc3 for BDW(Broadwell). +*/ +static const XenIGDDeviceIDInfo xen_igd_combo_id_infos[] = { +/* HSW Classic */ + {0x0402 ,0x8c4e ,0x04 },/* HSWGT1D, HSWD_w7 */ + {0x0406 ,0x8c4e ,0x04 },/* HSWGT1M, HSWM_w7 */ + {0x0412 ,0x8c4e ,0x04 },/* HSWGT2D, HSWD_w7 */ + {0x0416 ,0x8c4e ,0x04 },/* HSWGT2M, HSWM_w7 */ + {0x041E ,0x8c4e ,0x04 },/* HSWGT15D, HSWD_w7 */ +/* HSW ULT */ + {0x0A06 ,0x8c4e ,0x04 },/* HSWGT1UT, HSWM_w7 */ + {0x0A16 ,0x8c4e ,0x04 },/* HSWGT2UT, HSWM_w7 */ + {0x0A26 ,0x8c4e ,0x06 },/* HSWGT3UT, HSWM_w7 */ + {0x0A2E ,0x8c4e ,0x04 },/* HSWGT3UT28W, HSWM_w7 */ + {0x0A1E ,0x8c4e ,0x04 },/* HSWGT2UX, HSWM_w7 */ + {0x0A0E ,0x8c4e ,0x04 },/* HSWGT1ULX, HSWM_w7 */ +/* HSW CRW */ + {0x0D26 ,0x8c4e ,0x04 },/* HSWGT3CW, HSWM_w7 */ + {0x0D22 ,0x8c4e ,0x04 },/* HSWGT3CWDT, HSWD_w7 */ +/* HSW Server */ + {0x041A ,0x8c4e ,0x04 },/* HSWSVGT2, HSWD_w7 */ +/* HSW SRVR */ + {0x040A ,0x8c4e ,0x04 },/* HSWSVGT1, HSWD_w7 */ +/* BSW */ + {0x1606 ,0x9cc3 ,0x03 },/* BDWULTGT1, BDWM_w7 */ + {0x1616 ,0x9cc3 ,0x03 },/* BDWULTGT2, BDWM_w7 */ + {0x1626 ,0x9cc3 ,0x03 },/* BDWULTGT3, BDWM_w7 */ + {0x160E ,0x9cc3 ,0x03 },/* BDWULXGT1, BDWM_w7 */ + {0x161E ,0x9cc3 ,0x03 },/* BDWULXGT2, BDWM_w7 */ + {0x1602 ,0x9cc3 ,0x03 },/* BDWHALOGT1, BDWM_w7 */ + {0x1612 ,0x9cc3 ,0x03 },/* BDWHALOGT2, BDWM_w7 */ + {0x1622 ,0x9cc3 ,0x03 },/* BDWHALOGT3, BDWM_w7 */ + {0x162B ,0x9cc3 ,0x03 },/* BDWHALO28W, BDWM_w7 */ + {0x162A ,0x9cc3 ,0x03 },/* BDWGT3WRKS, BDWM_w7 */ + {0x162D ,0x9cc3 ,0x03 },/* BDWGT3SRVR, BDWM_w7 */ +}; + +static void isa_bridge_class_init (ObjectClass *klass,void *data) +{ +DeviceClass *dc =DEVICE_CLASS (klass); +PCIDeviceClass *k =PCI_DEVICE_CLASS (klass); + + dc->desc ="ISA bridge faked to support IGD PT" ; + k->vendor_id =PCI_VENDOR_ID_INTEL ; + k->class_id =PCI_CLASS_BRIDGE_ISA ; +}; + +static TypeInfo isa_bridge_info = { + .name ="xen-igd-passthrough-isa-bridge" , + .parent =TYPE_PCI_DEVICE , + .instance_size =sizeof (PCIDevice), + .class_init = isa_bridge_class_init, +}; + +static void xen_pt_graphics_register_types (void ) +{ +type_register_static (&isa_bridge_info); +} +type_init (xen_pt_graphics_register_types) + +static void +xen_igd_passthrough_isa_bridge_create (XenPCIPassthroughState *s, +XenHostPCIDevice *dev) +{ +struct PCIDevice *pci_dev; +int i, num; +uint16_t gpu_dev_id, pch_dev_id =0xffff ; +uint8_t pch_rev_id; +PCIDevice *d = &s->dev; + +if (!is_igd_vga_passthrough (dev)) { +return ; + } + + gpu_dev_id = dev->device_id; + num =ARRAY_SIZE (xen_igd_combo_id_infos); +for (i =0 ; i < num; i++) { +if (gpu_dev_id == xen_igd_combo_id_infos[i].gpu_device_id) { + pch_dev_id = xen_igd_combo_id_infos[i].pch_device_id; + pch_rev_id = xen_igd_combo_id_infos[i].pch_revision_id; + } + } + +if (pch_dev_id ==0xffff ) { +fprintf (stderr,"unsupported PCH!\n" ); +return ; + } + +/* Currently IGD drivers always need to access PCH by 1f.0. */ + pci_dev =pci_create_simple (d->bus,PCI_DEVFN (0x1f ,0 ), +"xen-igd-passthrough-isa-bridge" ); + +/* +* Identify PCH card with its own real vendor/device ids. +* Note that vendor id is always PCI_VENDOR_ID_INTEL. +*/ +if (!pci_dev) { +fprintf (stderr,"xen set xen-igd-passthrough-isa-bridge failed!\n" ); +return ; + } +pci_config_set_device_id (pci_dev->config, pch_dev_id); +pci_config_set_revision (pci_dev->config, pch_rev_id); +} +/* init */ static int xen_pt_initfn (PCIDevice *d)
@@ -680,6 +803,9 @@ static int xen_pt_initfn(PCIDevice *d)xen_host_pci_device_put (&s->real_device);return -1 ; } + +/* Register ISA bridge for passthrough GFX. */ +xen_igd_passthrough_isa_bridge_create (s, &s->real_device); }/* Handle real device's MMIO/PIO BARs */
Signature · 1 line
1.9.1
Re: [Qemu-devel] [v6][PATCH 07/10] xen, gfx passthrough: register a isa bridge
Quoted 1 line · Tiejun Chen
Currently IGD drivers always need to access PCH by 1f.0. But we
Obvious question: q35?
q35 already has a isa bridge @ 0x1f.0. Guess that needs to be extended for the pass-through then (simliar to the host bridge) instead of adding a dummy bridge.
Also: again xen naming here.
cheers,
Gerd
Re: [Qemu-devel] [v6][PATCH 07/10] xen, gfx passthrough: register a isa bridge
Quoted 5 lines · Gerd Hoffmann
Quoted 1 line · Tiejun Chen
Currently IGD drivers always need to access PCH by 1f.0. But we
Obvious question: q35?
Quoted 8 lines
q35 already has a isa bridge @ 0x1f.0. Guess that needs to be extended for the pass-through then (simliar to the host bridge) instead of adding a dummy bridge.
Also: again xen naming here.
cheers,
Gerd
This hack probably doesn't have a chance to work well for q35 due to the above conflict.
Happily future cards won't need it.
Signature · 1 line
MST
Re: [Qemu-devel] [v6][PATCH 07/10] xen, gfx passthrough: register a isa bridge
Quoted 10 lines · Michael S. Tsirkin
Quoted 9 lines · Gerd Hoffmann
Quoted 1 line · Tiejun Chen
Currently IGD drivers always need to access PCH by 1f.0. But we
Obvious question: q35?
q35 already has a isa bridge @ 0x1f.0. Guess that needs to be extended for the pass-through then (simliar to the host bridge) instead of adding a dummy bridge.
Quoted 7 lines
Quoted 4 lines
Also: again xen naming here.
cheers,
GerdThis hack probably doesn't have a chance to work well for q35 due to the above conflict.
Yeah, and I remember as we discussed previously, something else also conflict with Xen and Windows currently so Xen doesn't intend to go Q35.
Thanks
Tiejun
Quoted 2 lines
Happily future cards won't need it.
Re: [Qemu-devel] [v6][PATCH 07/10] xen, gfx passthrough: register a isa bridge
In reply to Tiejun ChenQuoted 124 lines · Tiejun Chen
Currently IGD drivers always need to access PCH by 1f.0. But we don't want to poke that directly to get ID, and although in real world different GPU should have different PCH. But actually the different PCH DIDs likely map to different PCH SKUs. We do the same thing for the GPU. For PCH, the different SKUs are going to be all the same silicon design and implementation, just different features turn on and off with fuses. The SW interfaces should be consistent across all SKUs in a given family (eg LPT). But just same features may not be supported.
Most of these different PCH features probably don't matter to the Gfx driver, but obviously any difference in display port connections will so it should be fine with any PCH in case of passthrough.
So currently use one PCH version,
0x8c4e, to cover all HSW(Haswell) scenarios,0x9cc3for BDW(Broadwell).Signed-off-by Tiejun Chen <[email protected]>--- hw/xen/xen_pt.c | 126 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 126 insertions(+)hw/xen/xen_pt.c +94
-0@@ -632,6 +632,129 @@ static const MemoryListener xen_pt_io_listener = { .priority = 10, }; +typedef struct { +uint16_t gpu_device_id; +uint16_t pch_device_id; +uint8_t pch_revision_id; +}XenIGDDeviceIDInfo ; + +/* In real world different GPU should have different PCH. But actually +* the different PCH DIDs likely map to different PCH SKUs. We do the +* same thing for the GPU. For PCH, the different SKUs are going to be +* all the same silicon design and implementation, just different +* features turn on and off with fuses. The SW interfaces should be +* consistent across all SKUs in a given family (eg LPT). But just same +* features may not be supported. +* +* Most of these different PCH features probably don't matter to the +* Gfx driver, but obviously any difference in display port connections +* will so it should be fine with any PCH in case of passthrough. +* +* So currently use one PCH version, 0x8c4e, to cover all HSW(Haswell) +* scenarios, 0x9cc3 for BDW(Broadwell). +*/ +static const XenIGDDeviceIDInfo xen_igd_combo_id_infos[] = { +/* HSW Classic */ + {0x0402 ,0x8c4e ,0x04 },/* HSWGT1D, HSWD_w7 */ + {0x0406 ,0x8c4e ,0x04 },/* HSWGT1M, HSWM_w7 */ + {0x0412 ,0x8c4e ,0x04 },/* HSWGT2D, HSWD_w7 */ + {0x0416 ,0x8c4e ,0x04 },/* HSWGT2M, HSWM_w7 */ + {0x041E ,0x8c4e ,0x04 },/* HSWGT15D, HSWD_w7 */ +/* HSW ULT */ + {0x0A06 ,0x8c4e ,0x04 },/* HSWGT1UT, HSWM_w7 */ + {0x0A16 ,0x8c4e ,0x04 },/* HSWGT2UT, HSWM_w7 */ + {0x0A26 ,0x8c4e ,0x06 },/* HSWGT3UT, HSWM_w7 */ + {0x0A2E ,0x8c4e ,0x04 },/* HSWGT3UT28W, HSWM_w7 */ + {0x0A1E ,0x8c4e ,0x04 },/* HSWGT2UX, HSWM_w7 */ + {0x0A0E ,0x8c4e ,0x04 },/* HSWGT1ULX, HSWM_w7 */ +/* HSW CRW */ + {0x0D26 ,0x8c4e ,0x04 },/* HSWGT3CW, HSWM_w7 */ + {0x0D22 ,0x8c4e ,0x04 },/* HSWGT3CWDT, HSWD_w7 */ +/* HSW Server */ + {0x041A ,0x8c4e ,0x04 },/* HSWSVGT2, HSWD_w7 */ +/* HSW SRVR */ + {0x040A ,0x8c4e ,0x04 },/* HSWSVGT1, HSWD_w7 */ +/* BSW */ + {0x1606 ,0x9cc3 ,0x03 },/* BDWULTGT1, BDWM_w7 */ + {0x1616 ,0x9cc3 ,0x03 },/* BDWULTGT2, BDWM_w7 */ + {0x1626 ,0x9cc3 ,0x03 },/* BDWULTGT3, BDWM_w7 */ + {0x160E ,0x9cc3 ,0x03 },/* BDWULXGT1, BDWM_w7 */ + {0x161E ,0x9cc3 ,0x03 },/* BDWULXGT2, BDWM_w7 */ + {0x1602 ,0x9cc3 ,0x03 },/* BDWHALOGT1, BDWM_w7 */ + {0x1612 ,0x9cc3 ,0x03 },/* BDWHALOGT2, BDWM_w7 */ + {0x1622 ,0x9cc3 ,0x03 },/* BDWHALOGT3, BDWM_w7 */ + {0x162B ,0x9cc3 ,0x03 },/* BDWHALO28W, BDWM_w7 */ + {0x162A ,0x9cc3 ,0x03 },/* BDWGT3WRKS, BDWM_w7 */ + {0x162D ,0x9cc3 ,0x03 },/* BDWGT3SRVR, BDWM_w7 */ +}; + +static void isa_bridge_class_init (ObjectClass *klass,void *data) +{ +DeviceClass *dc =DEVICE_CLASS (klass); +PCIDeviceClass *k =PCI_DEVICE_CLASS (klass); + + dc->desc ="ISA bridge faked to support IGD PT" ; + k->vendor_id =PCI_VENDOR_ID_INTEL ; + k->class_id =PCI_CLASS_BRIDGE_ISA ; +}; + +static TypeInfo isa_bridge_info = { + .name ="xen-igd-passthrough-isa-bridge" , + .parent =TYPE_PCI_DEVICE , + .instance_size =sizeof (PCIDevice), + .class_init = isa_bridge_class_init, +}; + +static void xen_pt_graphics_register_types (void ) +{ +type_register_static (&isa_bridge_info); +} +type_init (xen_pt_graphics_register_types) + +static void +xen_igd_passthrough_isa_bridge_create (XenPCIPassthroughState *s, +XenHostPCIDevice *dev) +{ +struct PCIDevice *pci_dev; +int i, num; +uint16_t gpu_dev_id, pch_dev_id =0xffff ; +uint8_t pch_rev_id; +PCIDevice *d = &s->dev; + +if (!is_igd_vga_passthrough (dev)) { +return ; + } + + gpu_dev_id = dev->device_id;
hw/xen/xen_pt.c static const MemoryListener xen_pt_io_listener = { · line 738
Quoted 10 lines
hw/xen/xen_pt.c +10
-0+ num =ARRAY_SIZE (xen_igd_combo_id_infos); +for (i =0 ; i < num; i++) { +if (gpu_dev_id == xen_igd_combo_id_infos[i].gpu_device_id) { + pch_dev_id = xen_igd_combo_id_infos[i].pch_device_id; + pch_rev_id = xen_igd_combo_id_infos[i].pch_revision_id; + } + } + +if (pch_dev_id ==0xffff ) { +fprintf (stderr,"unsupported PCH!\n" );
I would drop this fprintf: this likely means a newer card, so the bridge is not necessary.
hw/xen/xen_pt.c static const MemoryListener xen_pt_io_listener = { · line 747
Quoted 9 lines
hw/xen/xen_pt.c +9
-0+return ; + } + +/* Currently IGD drivers always need to access PCH by 1f.0. */ + pci_dev =pci_create_simple (d->bus,PCI_DEVFN (0x1f ,0 ), +"xen-igd-passthrough-isa-bridge" ); + +/* +* Identify PCH card with its own real vendor/device ids.
This no longer holds I think.
Quoted 25 lines
hw/xen/xen_pt.c +13
-0+* Note that vendor id is always PCI_VENDOR_ID_INTEL. +*/ +if (!pci_dev) { +fprintf (stderr,"xen set xen-igd-passthrough-isa-bridge failed!\n" ); +return ; + } +pci_config_set_device_id (pci_dev->config, pch_dev_id); +pci_config_set_revision (pci_dev->config, pch_rev_id); +} +/* init */ static int xen_pt_initfn (PCIDevice *d)@@ -680,6 +803,9 @@ static int xen_pt_initfn(PCIDevice *d)xen_host_pci_device_put (&s->real_device);return -1 ; } + +/* Register ISA bridge for passthrough GFX. */ +xen_igd_passthrough_isa_bridge_create (s, &s->real_device); }/* Handle real device's MMIO/PIO BARs */ Signature · 1 line
1.9.1
Re: [Qemu-devel] [v6][PATCH 07/10] xen, gfx passthrough: register a isa bridge
Quoted 6 lines
hw/xen/xen_pt.c static const MemoryListener xen_pt_io_listener = { · line 738
Quoted 3 lines
hw/xen/xen_pt.c +3
-0+ +if (pch_dev_id ==0xffff ) { +fprintf (stderr,"unsupported PCH!\n" );I would drop this fprintf: this likely means a newer card, so the bridge is not necessary.
Okay.
Quoted 12 lines
hw/xen/xen_pt.c static const MemoryListener xen_pt_io_listener = { · line 747
Quoted 10 lines
hw/xen/xen_pt.c +9
-0+return ; + } + +/* Currently IGD drivers always need to access PCH by 1f.0. */ + pci_dev =pci_create_simple (d->bus,PCI_DEVFN (0x1f ,0 ), +"xen-igd-passthrough-isa-bridge" ); + +/* +* Identify PCH card with its own real vendor/device ids. This no longer holds I think.
You're right.
Thanks
Tiejun
Re: [Qemu-devel] [v6][PATCH 07/10] xen, gfx passthrough: register a isa bridge
In reply to Tiejun ChenQuoted 103 lines · Tiejun Chen
Currently IGD drivers always need to access PCH by 1f.0. But we don't want to poke that directly to get ID, and although in real world different GPU should have different PCH. But actually the different PCH DIDs likely map to different PCH SKUs. We do the same thing for the GPU. For PCH, the different SKUs are going to be all the same silicon design and implementation, just different features turn on and off with fuses. The SW interfaces should be consistent across all SKUs in a given family (eg LPT). But just same features may not be supported.
Most of these different PCH features probably don't matter to the Gfx driver, but obviously any difference in display port connections will so it should be fine with any PCH in case of passthrough.
So currently use one PCH version,
0x8c4e, to cover all HSW(Haswell) scenarios,0x9cc3for BDW(Broadwell).Signed-off-by Tiejun Chen <[email protected]>--- hw/xen/xen_pt.c | 126 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 126 insertions(+)hw/xen/xen_pt.c +73
-0@@ -632,6 +632,129 @@ static const MemoryListener xen_pt_io_listener = { .priority = 10, }; +typedef struct { +uint16_t gpu_device_id; +uint16_t pch_device_id; +uint8_t pch_revision_id; +}XenIGDDeviceIDInfo ; + +/* In real world different GPU should have different PCH. But actually +* the different PCH DIDs likely map to different PCH SKUs. We do the +* same thing for the GPU. For PCH, the different SKUs are going to be +* all the same silicon design and implementation, just different +* features turn on and off with fuses. The SW interfaces should be +* consistent across all SKUs in a given family (eg LPT). But just same +* features may not be supported. +* +* Most of these different PCH features probably don't matter to the +* Gfx driver, but obviously any difference in display port connections +* will so it should be fine with any PCH in case of passthrough. +* +* So currently use one PCH version, 0x8c4e, to cover all HSW(Haswell) +* scenarios, 0x9cc3 for BDW(Broadwell). +*/ +static const XenIGDDeviceIDInfo xen_igd_combo_id_infos[] = { +/* HSW Classic */ + {0x0402 ,0x8c4e ,0x04 },/* HSWGT1D, HSWD_w7 */ + {0x0406 ,0x8c4e ,0x04 },/* HSWGT1M, HSWM_w7 */ + {0x0412 ,0x8c4e ,0x04 },/* HSWGT2D, HSWD_w7 */ + {0x0416 ,0x8c4e ,0x04 },/* HSWGT2M, HSWM_w7 */ + {0x041E ,0x8c4e ,0x04 },/* HSWGT15D, HSWD_w7 */ +/* HSW ULT */ + {0x0A06 ,0x8c4e ,0x04 },/* HSWGT1UT, HSWM_w7 */ + {0x0A16 ,0x8c4e ,0x04 },/* HSWGT2UT, HSWM_w7 */ + {0x0A26 ,0x8c4e ,0x06 },/* HSWGT3UT, HSWM_w7 */ + {0x0A2E ,0x8c4e ,0x04 },/* HSWGT3UT28W, HSWM_w7 */ + {0x0A1E ,0x8c4e ,0x04 },/* HSWGT2UX, HSWM_w7 */ + {0x0A0E ,0x8c4e ,0x04 },/* HSWGT1ULX, HSWM_w7 */ +/* HSW CRW */ + {0x0D26 ,0x8c4e ,0x04 },/* HSWGT3CW, HSWM_w7 */ + {0x0D22 ,0x8c4e ,0x04 },/* HSWGT3CWDT, HSWD_w7 */ +/* HSW Server */ + {0x041A ,0x8c4e ,0x04 },/* HSWSVGT2, HSWD_w7 */ +/* HSW SRVR */ + {0x040A ,0x8c4e ,0x04 },/* HSWSVGT1, HSWD_w7 */ +/* BSW */ + {0x1606 ,0x9cc3 ,0x03 },/* BDWULTGT1, BDWM_w7 */ + {0x1616 ,0x9cc3 ,0x03 },/* BDWULTGT2, BDWM_w7 */ + {0x1626 ,0x9cc3 ,0x03 },/* BDWULTGT3, BDWM_w7 */ + {0x160E ,0x9cc3 ,0x03 },/* BDWULXGT1, BDWM_w7 */ + {0x161E ,0x9cc3 ,0x03 },/* BDWULXGT2, BDWM_w7 */ + {0x1602 ,0x9cc3 ,0x03 },/* BDWHALOGT1, BDWM_w7 */ + {0x1612 ,0x9cc3 ,0x03 },/* BDWHALOGT2, BDWM_w7 */ + {0x1622 ,0x9cc3 ,0x03 },/* BDWHALOGT3, BDWM_w7 */ + {0x162B ,0x9cc3 ,0x03 },/* BDWHALO28W, BDWM_w7 */ + {0x162A ,0x9cc3 ,0x03 },/* BDWGT3WRKS, BDWM_w7 */ + {0x162D ,0x9cc3 ,0x03 },/* BDWGT3SRVR, BDWM_w7 */ +}; + +static void isa_bridge_class_init (ObjectClass *klass,void *data) +{ +DeviceClass *dc =DEVICE_CLASS (klass); +PCIDeviceClass *k =PCI_DEVICE_CLASS (klass); + + dc->desc ="ISA bridge faked to support IGD PT" ; + k->vendor_id =PCI_VENDOR_ID_INTEL ; + k->class_id =PCI_CLASS_BRIDGE_ISA ; +}; + +static TypeInfo isa_bridge_info = { + .name ="xen-igd-passthrough-isa-bridge" , + .parent =TYPE_PCI_DEVICE , + .instance_size =sizeof (PCIDevice), + .class_init = isa_bridge_class_init, +}; +
hw/xen/xen_pt.c static const MemoryListener xen_pt_io_listener = { · line 717
Quoted 10 lines
hw/xen/xen_pt.c +10
-0+static void xen_pt_graphics_register_types (void ) +{ +type_register_static (&isa_bridge_info); +} +type_init (xen_pt_graphics_register_types) + +static void +xen_igd_passthrough_isa_bridge_create (XenPCIPassthroughState *s, +XenHostPCIDevice *dev) +{
I suggest this implementation, and the table, are moved to the same file where igd-passthrough-isa-bridge is implemented. The function can get PCIDevice *d, this way it's not xen specific.
hw/xen/xen_pt.c static const MemoryListener xen_pt_io_listener = { · line 718
Quoted 1 line
hw/xen/xen_pt.c +1
-0+struct PCIDevice *pci_dev;
pls rename bridge_dev;
Quoted 54 lines
hw/xen/xen_pt.c +42
-0+int i, num; +uint16_t gpu_dev_id, pch_dev_id =0xffff ; +uint8_t pch_rev_id; +PCIDevice *d = &s->dev; + +if (!is_igd_vga_passthrough (dev)) { +return ; + } + + gpu_dev_id = dev->device_id; + num =ARRAY_SIZE (xen_igd_combo_id_infos); +for (i =0 ; i < num; i++) { +if (gpu_dev_id == xen_igd_combo_id_infos[i].gpu_device_id) { + pch_dev_id = xen_igd_combo_id_infos[i].pch_device_id; + pch_rev_id = xen_igd_combo_id_infos[i].pch_revision_id; + } + } + +if (pch_dev_id ==0xffff ) { +fprintf (stderr,"unsupported PCH!\n" ); +return ; + } + +/* Currently IGD drivers always need to access PCH by 1f.0. */ + pci_dev =pci_create_simple (d->bus,PCI_DEVFN (0x1f ,0 ), +"xen-igd-passthrough-isa-bridge" ); + +/* +* Identify PCH card with its own real vendor/device ids. +* Note that vendor id is always PCI_VENDOR_ID_INTEL. +*/ +if (!pci_dev) { +fprintf (stderr,"xen set xen-igd-passthrough-isa-bridge failed!\n" ); +return ; + } +pci_config_set_device_id (pci_dev->config, pch_dev_id); +pci_config_set_revision (pci_dev->config, pch_rev_id); +} +/* init */ static int xen_pt_initfn (PCIDevice *d)@@ -680,6 +803,9 @@ static int xen_pt_initfn(PCIDevice *d)xen_host_pci_device_put (&s->real_device);return -1 ; } + +/* Register ISA bridge for passthrough GFX. */ +xen_igd_passthrough_isa_bridge_create (s, &s->real_device); }/* Handle real device's MMIO/PIO BARs */ Signature · 1 line
1.9.1
Re: [Qemu-devel] [v6][PATCH 07/10] xen, gfx passthrough: register a isa bridge
Quoted 9 lines
hw/xen/xen_pt.c static const MemoryListener xen_pt_io_listener = { · line 717
Quoted 4 lines
hw/xen/xen_pt.c +4
-0+static void +xen_igd_passthrough_isa_bridge_create (XenPCIPassthroughState *s, +XenHostPCIDevice *dev) +{I suggest this implementation, and the table, are moved to the same file where igd-passthrough-isa-bridge is implemented. The function can get PCIDevice *d, this way it's not xen specific.
Absolutely, you're right.
Actually I already start to work this way since Gerd said this should have a common between Xen and Kvm(KvmGT).
Quoted 6 lines
Quoted 4 lines
+ struct PCIDevice
*pci_dev;pls rename
bridge_dev;
Okay.
Thanks
Tiejun
PATCH v6 8/10 xen, gfx passthrough: support Intel IGD passthrough with VT-D
In reply to Tiejun ChenSome registers of Intel IGD are mapped in host bridge, so it needs to passthrough these registers of physical host bridge to guest because emulated host bridge in guest doesn't have these mappings.
--- hw/pci-host/piix.c | 3 ++ hw/xen/xen_pt.h | 1 + hw/xen/xen_pt_graphics.c | 72 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 76 insertions(+)
hw/pci-host/piix.c +3 -0
@@ -34,6 +34,7 @@#include "sysemu/sysemu.h" #include "hw/i386/ioapic.h" #include "qapi/visitor.h" +#include "hw/xen/xen_pt.h" /* * I440FX chipset data sheet.
@@ -733,8 +734,10 @@ static void xen_igd_passthrough_i440fx_class_init(ObjectClass *klass, void *data) {DeviceClass *dc =DEVICE_CLASS (klass); +PCIDeviceClass *k =PCI_DEVICE_CLASS (klass); dc->desc ="IGD PT XEN Host bridge" ; + k->config_read = xen_igd_pci_read; }static const TypeInfo xen_igd_passthrough_i440fx_info = {
hw/xen/xen_pt.h +1 -0
@@ -5,6 +5,7 @@#include "hw/xen/xen_common.h" #include "hw/pci/pci.h" #include "xen-host-pci-device.h" +uint32_t xen_igd_pci_read (PCIDevice *pci_dev,uint32_t config_addr,int len); void xen_pt_log(const PCIDevice *d, const char *f, ...) GCC_FMT_ATTR(2, 3);
hw/xen/xen_pt_graphics.c +72 -0
81 lines not on this page · raw message
Signature · 1 line
1.9.1
Re: [Qemu-devel] [v6][PATCH 08/10] xen, gfx passthrough: support Intel IGD passthrough with VT-D
Quoted 94 lines · Tiejun Chen
Some registers of Intel IGD are mapped in host bridge, so it needs to passthrough these registers of physical host bridge to guest because emulated host bridge in guest doesn't have these mappings.
Signed-off-by Tiejun Chen <[email protected]>Signed-off-by Yang Zhang <[email protected]>--- hw/pci-host/piix.c | 3 ++ hw/xen/xen_pt.h | 1 + hw/xen/xen_pt_graphics.c | 72 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 76 insertions(+)hw/pci-host/piix.c +3
-0@@ -34,6 +34,7 @@#include "sysemu/sysemu.h" #include "hw/i386/ioapic.h" #include "qapi/visitor.h" +#include "hw/xen/xen_pt.h" /* * I440FX chipset data sheet. @@ -733,8 +734,10 @@ static void xen_igd_passthrough_i440fx_class_init(ObjectClass *klass, void *data) {DeviceClass *dc =DEVICE_CLASS (klass); +PCIDeviceClass *k =PCI_DEVICE_CLASS (klass); dc->desc ="IGD PT XEN Host bridge" ; + k->config_read = xen_igd_pci_read; }static const TypeInfo xen_igd_passthrough_i440fx_info = {hw/xen/xen_pt.h +1
-0@@ -5,6 +5,7 @@#include "hw/xen/xen_common.h" #include "hw/pci/pci.h" #include "xen-host-pci-device.h" +uint32_t xen_igd_pci_read (PCIDevice *pci_dev,uint32_t config_addr,int len); void xen_pt_log(const PCIDevice *d, const char *f, ...) GCC_FMT_ATTR(2, 3);hw/xen/xen_pt_graphics.c +32
-0@@ -4,6 +4,7 @@#include "xen_pt.h" #include "xen-host-pci-device.h" #include "hw/xen/xen_backend.h" +#include "hw/pci/pci_bus.h" typedef struct VGARegion { int type; /* Memory or port I/O */@@ -188,3 +189,74 @@ int xen_pt_setup_vga(XenPCIPassthroughState *s, XenHostPCIDevice *dev)cpu_physical_memory_rw (0xc0000 , bios, bios_size,1 );return 0 ; } + +/* +* Currently we just pass this physical host bridge for IGD, 00:02.0. +* +* Here pci_dev is just that host bridge, so we have to get that real +* passthrough device by that given devfn to avoid other devices access. +*/ +static int is_igd_passthrough (PCIDevice *pci_dev) +{ +PCIDevice *f = pci_dev->bus->devices[PCI_DEVFN (2 ,0 )]; +if (pci_dev->bus->devices[PCI_DEVFN (2 ,0 )]) { +XenPCIPassthroughState *s =DO_UPCAST (XenPCIPassthroughState, dev, f); +return (is_igd_vga_passthrough (&s->real_device) + && (s->real_device.vendor_id ==PCI_VENDOR_ID_INTEL )); + }else { +return 0 ; + } +} + +uint32_t xen_igd_pci_read (PCIDevice *pci_dev,uint32_t config_addr,int len) +{ +XenHostPCIDevice dev; +uint32_t val; +int r; + +/* IGD read/write is through the host bridge. +*/ +assert (pci_dev->devfn ==0x00 ); + +if (!is_igd_passthrough (pci_dev)) { + goto read_default;
hw/xen/xen_pt_graphics.c int xen_pt_setup_vga(XenPCIPassthroughState *s, XenHostPCIDevice *dev) · line 232
Quoted 10 lines
hw/xen/xen_pt_graphics.c +10
-0+ } + +/* Just work for the i915 driver. */ +switch (config_addr) { +case 0x08 :/* revision id */ +case 0x2c :/* sybsystem vendor id */ +case 0x2e :/* sybsystem id */ +case 0x50 :/* SNB: processor graphics control register */ +case 0x52 :/* processor graphics control register */ +case 0xa0 :/* top of memory */
Is this host physical memory? If yes how can using it in guest work?
hw/xen/xen_pt_graphics.c int xen_pt_setup_vga(XenPCIPassthroughState *s, XenHostPCIDevice *dev) · line 234
Quoted 2 lines
hw/xen/xen_pt_graphics.c +2
-0+case 0xa4 :/* SNB: graphics base of stolen memory */ +case 0xa8 :/* SNB: base of GTT stolen memory */
Same question for above two.
Quoted 18 lines
hw/xen/xen_pt_graphics.c +18
-0+break ; +default : +/* Just gets the emulated values. */ + goto read_default; + } + +/* Host read */ + r =xen_host_pci_device_get (&dev,0 ,0 ,0 ,0 ); +if (r) { + goto err_out; + } + + r =xen_host_pci_get_block (&dev, config_addr, (uint8_t *)&val, len); +if (r) { + goto err_out; + } + +xen_host_pci_device_put (&dev);
hw/xen/xen_pt_graphics.c int xen_pt_setup_vga(XenPCIPassthroughState *s, XenHostPCIDevice *dev) · line 262
Quoted 10 lines
hw/xen/xen_pt_graphics.c +10
-0+ +return val; + +read_default: +return pci_default_read_config (pci_dev, config_addr, len); + +err_out: +XEN_PT_ERR (pci_dev,"Can't get pci_dev_host_bridge\n" ); +return -1 ; +}
Do any of the above registers change with time? Does it work if we just read them when device is created and put in dev->config?
Quoted 2 lines
Signature · 1 line
1.9.1
Re: [Qemu-devel] [v6][PATCH 08/10] xen, gfx passthrough: support Intel IGD passthrough with VT-D
Quoted 16 lines
Quoted 16 lines
hw/xen/xen_pt_graphics.c +16
-0+uint32_t xen_igd_pci_read (PCIDevice *pci_dev,uint32_t config_addr,int len) +{ +XenHostPCIDevice dev; +uint32_t val; +int r; + +/* IGD read/write is through the host bridge. +*/ +assert (pci_dev->devfn ==0x00 ); + +if (!is_igd_passthrough (pci_dev)) { + goto read_default; + } + +/* Just work for the i915 driver. */ +switch (config_addr) {
Quoted 8 lines
hw/xen/xen_pt_graphics.c int xen_pt_setup_vga(XenPCIPassthroughState *s, XenHostPCIDevice *dev) · line 232
Quoted 6 lines
hw/xen/xen_pt_graphics.c +6
-0+case 0x08 :/* revision id */ +case 0x2c :/* sybsystem vendor id */ +case 0x2e :/* sybsystem id */ +case 0x50 :/* SNB: processor graphics control register */ +case 0x52 :/* processor graphics control register */ +case 0xa0 :/* top of memory */ Is this host physical memory? If yes how can using it in guest work?
This is just a threshold value, not a start or end address :)
Quoted 5 lines
hw/xen/xen_pt_graphics.c int xen_pt_setup_vga(XenPCIPassthroughState *s, XenHostPCIDevice *dev) · line 234
Quoted 3 lines
hw/xen/xen_pt_graphics.c +2
-0+case 0xa4 :/* SNB: graphics base of stolen memory */ +case 0xa8 :/* SNB: base of GTT stolen memory */ Same question for above two.
I shouldn't matter since I remember we already discussed this previously but I can't sort out this from those emails now.
Allen,
Could you reexplain this?
Quoted 23 lines
Quoted 23 lines
hw/xen/xen_pt_graphics.c +22
-0+break ; +default : +/* Just gets the emulated values. */ + goto read_default; + } + +/* Host read */ + r =xen_host_pci_device_get (&dev,0 ,0 ,0 ,0 ); +if (r) { + goto err_out; + } + + r =xen_host_pci_get_block (&dev, config_addr, (uint8_t *)&val, len); +if (r) { + goto err_out; + } + +xen_host_pci_device_put (&dev); + +return val; + +read_default:
Quoted 8 lines
hw/xen/xen_pt_graphics.c int xen_pt_setup_vga(XenPCIPassthroughState *s, XenHostPCIDevice *dev) · line 262
Quoted 6 lines
hw/xen/xen_pt_graphics.c +6
-0+return pci_default_read_config (pci_dev, config_addr, len); + +err_out: +XEN_PT_ERR (pci_dev,"Can't get pci_dev_host_bridge\n" ); +return -1 ; +}Do any of the above registers change with time?
Think about we just provide read ops, so they're not changed based on my experiential.
Quoted 2 lines
Does it work if we just read them when device is created and put in
dev->config?
I think this is a good idea so I will go there and thank you.
Tiejun
Re: [Qemu-devel] [v6][PATCH 08/10] xen, gfx passthrough: support Intel IGD passthrough with VT-D
Quoted 36 lines
-----Original Message-----
From: Chen, Tiejun
Sent: Tuesday, January 20, 2015 7:17 PM
To: Michael S. Tsirkin; Kay, Allen M
Cc: [email protected]; [email protected]; [email protected]; Zhang, Yang Z; [email protected]
Subject: Re: [v6][PATCH 08/10] xen, gfx passthrough: support Intel IGD passthrough with VT-DQuoted 16 lines
Quoted 16 lines
hw/xen/xen_pt_graphics.c +16
-0+uint32_t xen_igd_pci_read (PCIDevice *pci_dev,uint32_t config_addr, +int len) { +XenHostPCIDevice dev; +uint32_t val; +int r; + +/* IGD read/write is through the host bridge. +*/ +assert (pci_dev->devfn ==0x00 ); + +if (!is_igd_passthrough (pci_dev)) { + goto read_default; + } + +/* Just work for the i915 driver. */ +switch (config_addr) {Quoted 8 lines
hw/xen/xen_pt_graphics.c int xen_pt_setup_vga(XenPCIPassthroughState *s, XenHostPCIDevice *dev) · line 232
Quoted 6 lines
hw/xen/xen_pt_graphics.c +6
-0+case 0x08 :/* revision id */ +case 0x2c :/* sybsystem vendor id */ +case 0x2e :/* sybsystem id */ +case 0x50 :/* SNB: processor graphics control register */ +case 0x52 :/* processor graphics control register */ +case 0xa0 :/* top of memory */ Is this host physical memory? If yes how can using it in guest work?
Quoted 2 lines
This is just a threshold value, not a start or end address :)
"top of memory" is no longer used in new versions of Windows drivers. Tiejun and I have tried BDW/HSW drivers and found they work without the need to passthrough 0xa0 register in the host bridge. It can be removed.
Quoted 4 lines
Quoted 4 lines
Quoted 3 lines
hw/xen/xen_pt_graphics.c +2
-0+case 0xa4 :/* SNB: graphics base of stolen memory */ +case 0xa8 :/* SNB: base of GTT stolen memory */
Quoted 9 lines
Quoted 1 line
Same question for above two.
I shouldn't matter since I remember we already discussed this previously but I can't sort out this from those emails now.
Allen,
Could you reexplain this?
These two "stolen memory" regions are part of the VT-d RMRR region. They are 1:1 mapped in the guest (GPA == HPA). Tiejun found they are needed by vBIOS during boot. Modern Windows driver no longer need to access these two registers in MCH.
Quoted 35 lines
Quoted 23 lines
Quoted 23 lines
hw/xen/xen_pt_graphics.c +22
-0+break ; +default : +/* Just gets the emulated values. */ + goto read_default; + } + +/* Host read */ + r =xen_host_pci_device_get (&dev,0 ,0 ,0 ,0 ); +if (r) { + goto err_out; + } + + r =xen_host_pci_get_block (&dev, config_addr, (uint8_t *)&val, len); +if (r) { + goto err_out; + } + +xen_host_pci_device_put (&dev); + +return val; + +read_default:Quoted 8 lines
hw/xen/xen_pt_graphics.c int xen_pt_setup_vga(XenPCIPassthroughState *s, XenHostPCIDevice *dev) · line 262
Quoted 6 lines
hw/xen/xen_pt_graphics.c +6
-0+return pci_default_read_config (pci_dev, config_addr, len); + +err_out: +XEN_PT_ERR (pci_dev,"Can't get pci_dev_host_bridge\n" ); +return -1 ; +}Do any of the above registers change with time?
Think about we just provide read ops, so they're not changed based on my experiential.
Quoted 7 lines
Quoted 2 lines
Does it work if we just read them when device is created and put in
dev->config?I think this is a good idea so I will go there and thank you.
Tiejun
Allen
PATCH v6 9/10 xen, gfx passthrough: register host bridge specific to passthrough
In reply to Tiejun ChenJust register that pci host bridge specific to passthrough.
--- hw/i386/pc_piix.c | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-)
hw/i386/pc_piix.c +17 -2
@@ -50,7 +50,8 @@#include "cpu.h" #include "qemu/error-report.h" #ifdef CONFIG_XEN -# include <xen/hvm/hvm_info_table.h> +#include <xen/hvm/hvm_info_table.h> +#include "hw/xen/xen_pt.h" #endif #define MAX_IDE_BUS 2
@@ -496,11 +497,25 @@ static void pc_init_isa(MachineState *machine) }#ifdef CONFIG_XEN +static void xen_igd_passthrough_pc_init_pci (MachineState *machine) +{ +pc_init1 (machine,1 ,1 ,TYPE_I440FX_PCI_HOST_BRIDGE , +TYPE_XEN_IGD_PASSTHROUGH_I440FX_PCI_DEVICE ); +} + +static void xen_pc_init_pci (MachineState *machine) +{ +if (xen_has_gfx_passthru) +xen_igd_passthrough_pc_init_pci (machine); +else +pc_init_pci (machine); +} +static void pc_xen_hvm_init (MachineState *machine) {PCIBus *bus; -pc_init_pci (machine); +xen_pc_init_pci (machine); bus =pci_find_primary_bus ();if (bus !=NULL ) {
Signature · 1 line
1.9.1
PATCH v6 10/10 xen, gfx passthrough: add opregion mapping
In reply to Tiejun ChenThe OpRegion shouldn't be mapped 1:1 because the address in the host can't be used in the guest directly.
This patch traps read and write access to the opregion of the Intel GPU config space (offset 0xfc).
The original patch is from Jean Guyader <[email protected]>
--- hw/xen/xen_pt.h | 6 +++- hw/xen/xen_pt_config_init.c | 52 ++++++++++++++++++++++++++-- hw/xen/xen_pt_graphics.c | 82 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 137 insertions(+), 3 deletions(-)
hw/xen/xen_pt.h +5 -1
@@ -37,6 +37,9 @@ typedef struct XenPTReg XenPTReg;typedef struct XenPCIPassthroughState XenPCIPassthroughState ; +uint32_t igd_read_opregion (XenPCIPassthroughState *s); +void igd_write_opregion (XenPCIPassthroughState *s,uint32_t val); +/* function type for config reg */ typedef int (*xen_pt_conf_reg_init ) (XenPCIPassthroughState *, XenPTRegInfo *, uint32_t real_offset,
@@ -63,8 +66,9 @@ typedef int (*xen_pt_conf_byte_read)#define XEN_PT_BAR_ALLF 0xFFFFFFFF#define XEN_PT_BAR_UNMAPPED (-1) -#define PCI_CAP_MAX 48 +#define XEN_PCI_CAP_MAX 48 +#define XEN_PCI_INTEL_OPREGION 0xfc typedef enum { XEN_PT_GRP_TYPE_HARDWIRED = 0, /* 0 Hardwired reg group */
hw/xen/xen_pt_config_init.c +50 -2
88 lines not on this page · raw message
hw/xen/xen_pt_graphics.c +82 -0
103 lines not on this page · raw message
Signature · 1 line
1.9.1