Re: [Qemu-devel] [RFC][PATCH 2/2] xen:i386:pc_piix: create isa bridge specific to IGD passthrough

2014-11-17 Thread Michael S. Tsirkin
On Mon, Nov 17, 2014 at 07:18:17PM +0800, Chen, Tiejun wrote:
> On 2014/11/17 18:13, Michael S. Tsirkin wrote:
> >On Mon, Nov 17, 2014 at 05:42:12PM +0800, Chen, Tiejun wrote:
> >>On 2014/11/17 17:25, Michael S. Tsirkin wrote:
> >>>On Mon, Nov 17, 2014 at 04:48:32PM +0800, Chen, Tiejun wrote:
> On 2014/11/17 14:10, Michael S. Tsirkin wrote:
> >On Mon, Nov 17, 2014 at 10:47:56AM +0800, Chen, Tiejun wrote:
> >>On 2014/11/5 22:09, Michael S. Tsirkin wrote:
> >>>On Wed, Nov 05, 2014 at 03:22:59PM +0800, Tiejun Chen wrote:
> Currently IGD drivers always need to access PCH by 1f.0, and
> PCH vendor/device id is used to identify the card.
> 
> Signed-off-by: Tiejun Chen 
> ---
> >>
> >>[snip]
> >>
> >>>Cleaner:
> >>>if (!pci_dev) {
> >>>   fprintf
> >>>   return;
> >>>   }
> >>>  pci_config_set_device_id(pci_dev->config, pch_id);
> >>
> >>I will address all comments and thanks.
> >>
> >>>
> +}
> +}
> +
>   /* init */
> 
>   static int xen_pt_initfn(PCIDevice *d)
> @@ -682,6 +770,9 @@ static int xen_pt_initfn(PCIDevice *d)
>   return -1;
>   }
> 
> +/* Register ISA bridge for passthrough GFX. */
> +xen_igd_passthrough_isa_bridge_create(s, &s->real_device);
> +
>   /* reinitialize each config register to be emulated */
>   if (xen_pt_config_init(s)) {
>   XEN_PT_ERR(d, "PCI Config space initialisation failed.\n");
> 
> Note I will introduce a inline function in another patch,
> 
> +static inline int is_vga_passthrough(XenHostPCIDevice *dev)
> +{
> +return (xen_has_gfx_passthru && (dev->vendor_id == 
> PCI_VENDOR_ID_INTEL)
> +&& ((dev->class_code >> 0x8) == PCI_CLASS_DISPLAY_VGA));
> +}
> 
> Thanks
> Tiejun
> >>>
> >>>Why bother with all these conditions?
> >>>Won't it be enough to check dev->vendor_id == PCI_VENDOR_ID_INTEL?
> >>>
> >>
> >>If this is just used for IGD, its always fine without checking vendor_id.
> >
> >You need to match device ID to *know* it's IGD.
> >
> >>So after remove that check, I guess I need to rename that as
> >>is_igd_vga_passthrough() to make sense.
> >>
> >>Thanks
> >>Tiejun
> >
> >There is no need to check class code or xen_has_gfx_passthru flag.
> >Device ID + vendor ID identifies each device uniquely.
> >
> 
> Yeah.
> 
> Here I assume vendor ID is always PCI_VENDOR_ID_INTEL so looks you means I
> also need to check that table to do something like,
> 
> is_igd_vga_passthugh(dev)
> { 
>   int i;
>   int num = ARRAY_SIZE(xen_igd_combo_id_infos);
>   for (i = 0; i < num; i++) {
>   if (dev->device_id == xen_igd_combo_id_infos[i].gpu_device_id)
>   return 1;
>   return 0;
> }
> 
> Then we can simplify the subsequent codes based on this, right?
> 
> Thanks
> Tiejun

Yea.
Basically let's try to treat this simply as a device quirk,
and see where this gets us.

-- 
MST



Re: [Qemu-devel] [RFC][PATCH 2/2] xen:i386:pc_piix: create isa bridge specific to IGD passthrough

2014-11-17 Thread Chen, Tiejun

On 2014/11/17 18:13, Michael S. Tsirkin wrote:

On Mon, Nov 17, 2014 at 05:42:12PM +0800, Chen, Tiejun wrote:

On 2014/11/17 17:25, Michael S. Tsirkin wrote:

On Mon, Nov 17, 2014 at 04:48:32PM +0800, Chen, Tiejun wrote:

On 2014/11/17 14:10, Michael S. Tsirkin wrote:

On Mon, Nov 17, 2014 at 10:47:56AM +0800, Chen, Tiejun wrote:

On 2014/11/5 22:09, Michael S. Tsirkin wrote:

On Wed, Nov 05, 2014 at 03:22:59PM +0800, Tiejun Chen wrote:

Currently IGD drivers always need to access PCH by 1f.0, and
PCH vendor/device id is used to identify the card.

Signed-off-by: Tiejun Chen 
---


[snip]


Cleaner:
 if (!pci_dev) {
fprintf
return;
}
  pci_config_set_device_id(pci_dev->config, pch_id);


I will address all comments and thanks.




+}
+}
+
  /* init */

  static int xen_pt_initfn(PCIDevice *d)
@@ -682,6 +770,9 @@ static int xen_pt_initfn(PCIDevice *d)
  return -1;
  }

+/* Register ISA bridge for passthrough GFX. */
+xen_igd_passthrough_isa_bridge_create(s, &s->real_device);
+
  /* reinitialize each config register to be emulated */
  if (xen_pt_config_init(s)) {
  XEN_PT_ERR(d, "PCI Config space initialisation failed.\n");

Note I will introduce a inline function in another patch,

+static inline int is_vga_passthrough(XenHostPCIDevice *dev)
+{
+return (xen_has_gfx_passthru && (dev->vendor_id == PCI_VENDOR_ID_INTEL)
+&& ((dev->class_code >> 0x8) == PCI_CLASS_DISPLAY_VGA));
+}

Thanks
Tiejun


Why bother with all these conditions?
Won't it be enough to check dev->vendor_id == PCI_VENDOR_ID_INTEL?



If this is just used for IGD, its always fine without checking vendor_id.


You need to match device ID to *know* it's IGD.


So after remove that check, I guess I need to rename that as
is_igd_vga_passthrough() to make sense.

Thanks
Tiejun


There is no need to check class code or xen_has_gfx_passthru flag.
Device ID + vendor ID identifies each device uniquely.



Yeah.

Here I assume vendor ID is always PCI_VENDOR_ID_INTEL so looks you means 
I also need to check that table to do something like,


is_igd_vga_passthugh(dev)
{   
int i;
int num = ARRAY_SIZE(xen_igd_combo_id_infos);
for (i = 0; i < num; i++) {
if (dev->device_id == xen_igd_combo_id_infos[i].gpu_device_id)
return 1;
return 0;
}

Then we can simplify the subsequent codes based on this, right?

Thanks
Tiejun




Re: [Qemu-devel] [RFC][PATCH 2/2] xen:i386:pc_piix: create isa bridge specific to IGD passthrough

2014-11-17 Thread Michael S. Tsirkin
On Mon, Nov 17, 2014 at 05:42:12PM +0800, Chen, Tiejun wrote:
> On 2014/11/17 17:25, Michael S. Tsirkin wrote:
> >On Mon, Nov 17, 2014 at 04:48:32PM +0800, Chen, Tiejun wrote:
> >>On 2014/11/17 14:10, Michael S. Tsirkin wrote:
> >>>On Mon, Nov 17, 2014 at 10:47:56AM +0800, Chen, Tiejun wrote:
> On 2014/11/5 22:09, Michael S. Tsirkin wrote:
> >On Wed, Nov 05, 2014 at 03:22:59PM +0800, Tiejun Chen wrote:
> >>Currently IGD drivers always need to access PCH by 1f.0, and
> >>PCH vendor/device id is used to identify the card.
> >>
> >>Signed-off-by: Tiejun Chen 
> >>---
> 
> [snip]
> 
> >Cleaner:
> >  if (!pci_dev) {
> > fprintf
> > return;
> > }
> >  pci_config_set_device_id(pci_dev->config, pch_id);
> 
> I will address all comments and thanks.
> 
> >
> >>+}
> >>+}
> >>+
> >>  /* init */
> >>
> >>  static int xen_pt_initfn(PCIDevice *d)
> >>@@ -682,6 +770,9 @@ static int xen_pt_initfn(PCIDevice *d)
> >>  return -1;
> >>  }
> >>
> >>+/* Register ISA bridge for passthrough GFX. */
> >>+xen_igd_passthrough_isa_bridge_create(s, &s->real_device);
> >>+
> >>  /* reinitialize each config register to be emulated */
> >>  if (xen_pt_config_init(s)) {
> >>  XEN_PT_ERR(d, "PCI Config space initialisation failed.\n");
> >>
> >>Note I will introduce a inline function in another patch,
> >>
> >>+static inline int is_vga_passthrough(XenHostPCIDevice *dev)
> >>+{
> >>+return (xen_has_gfx_passthru && (dev->vendor_id == PCI_VENDOR_ID_INTEL)
> >>+&& ((dev->class_code >> 0x8) == PCI_CLASS_DISPLAY_VGA));
> >>+}
> >>
> >>Thanks
> >>Tiejun
> >
> >Why bother with all these conditions?
> >Won't it be enough to check dev->vendor_id == PCI_VENDOR_ID_INTEL?
> >
> 
> If this is just used for IGD, its always fine without checking vendor_id.

You need to match device ID to *know* it's IGD.

> So after remove that check, I guess I need to rename that as
> is_igd_vga_passthrough() to make sense.
> 
> Thanks
> Tiejun

There is no need to check class code or xen_has_gfx_passthru flag.
Device ID + vendor ID identifies each device uniquely.

-- 
MST



Re: [Qemu-devel] [RFC][PATCH 2/2] xen:i386:pc_piix: create isa bridge specific to IGD passthrough

2014-11-17 Thread Chen, Tiejun

On 2014/11/17 17:25, Michael S. Tsirkin wrote:

On Mon, Nov 17, 2014 at 04:48:32PM +0800, Chen, Tiejun wrote:

On 2014/11/17 14:10, Michael S. Tsirkin wrote:

On Mon, Nov 17, 2014 at 10:47:56AM +0800, Chen, Tiejun wrote:

On 2014/11/5 22:09, Michael S. Tsirkin wrote:

On Wed, Nov 05, 2014 at 03:22:59PM +0800, Tiejun Chen wrote:

Currently IGD drivers always need to access PCH by 1f.0, and
PCH vendor/device id is used to identify the card.

Signed-off-by: Tiejun Chen 
---


[snip]


Cleaner:
 if (!pci_dev) {
fprintf
return;
}
  pci_config_set_device_id(pci_dev->config, pch_id);


I will address all comments and thanks.




+}
+}
+
  /* init */

  static int xen_pt_initfn(PCIDevice *d)
@@ -682,6 +770,9 @@ static int xen_pt_initfn(PCIDevice *d)
  return -1;
  }

+/* Register ISA bridge for passthrough GFX. */
+xen_igd_passthrough_isa_bridge_create(s, &s->real_device);
+
  /* reinitialize each config register to be emulated */
  if (xen_pt_config_init(s)) {
  XEN_PT_ERR(d, "PCI Config space initialisation failed.\n");

Note I will introduce a inline function in another patch,

+static inline int is_vga_passthrough(XenHostPCIDevice *dev)
+{
+return (xen_has_gfx_passthru && (dev->vendor_id == PCI_VENDOR_ID_INTEL)
+&& ((dev->class_code >> 0x8) == PCI_CLASS_DISPLAY_VGA));
+}

Thanks
Tiejun


Why bother with all these conditions?
Won't it be enough to check dev->vendor_id == PCI_VENDOR_ID_INTEL?



If this is just used for IGD, its always fine without checking vendor_id.

So after remove that check, I guess I need to rename that as 
is_igd_vga_passthrough() to make sense.


Thanks
Tiejun



Re: [Qemu-devel] [RFC][PATCH 2/2] xen:i386:pc_piix: create isa bridge specific to IGD passthrough

2014-11-17 Thread Michael S. Tsirkin
On Mon, Nov 17, 2014 at 04:48:32PM +0800, Chen, Tiejun wrote:
> On 2014/11/17 14:10, Michael S. Tsirkin wrote:
> >On Mon, Nov 17, 2014 at 10:47:56AM +0800, Chen, Tiejun wrote:
> >>On 2014/11/5 22:09, Michael S. Tsirkin wrote:
> >>>On Wed, Nov 05, 2014 at 03:22:59PM +0800, Tiejun Chen wrote:
> Currently IGD drivers always need to access PCH by 1f.0, and
> PCH vendor/device id is used to identify the card.
> 
> Signed-off-by: Tiejun Chen 
> ---
>   hw/i386/pc_piix.c | 28 +++-
>   1 file changed, 27 insertions(+), 1 deletion(-)
> 
> diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
> index b559181..b19c7a9 100644
> --- a/hw/i386/pc_piix.c
> +++ b/hw/i386/pc_piix.c
> @@ -50,7 +50,7 @@
>   #include "cpu.h"
>   #include "qemu/error-report.h"
>   #ifdef CONFIG_XEN
> -#  include 
> +#include 
>   #endif
> 
>   #define MAX_IDE_BUS 2
> @@ -452,6 +452,31 @@ static void pc_init_isa(MachineState *machine)
>   }
> 
>   #ifdef CONFIG_XEN
> +static void xen_igd_passthrough_isa_bridge_create(PCIBus *bus)
> +{
> +struct PCIDevice *dev;
> +Error *local_err = NULL;
> +uint16_t device_id = 0x;
> +
> +/* Currently IGD drivers always need to access PCH by 1f.0. */
> +dev = pci_create_simple(bus, PCI_DEVFN(0x1f, 0),
> +"xen-igd-passthrough-isa-bridge");
> +
> +/* Identify PCH card with its own real vendor/device ids.
> + * Here that vendor id is always PCI_VENDOR_ID_INTEL.
> + */
> +if (dev) {
> +device_id = object_property_get_int(OBJECT(dev), "device-id",
> +&local_err);
> +if (!local_err && device_id != 0x) {
> +pci_config_set_device_id(dev->config, device_id);
> +return;
> +}
> +}
> +
> +fprintf(stderr, "xen set xen-igd-passthrough-isa-bridge failed\n");
> +}
> +
>   static void pc_xen_hvm_init(MachineState *machine)
>   {
>   PCIBus *bus;
> @@ -461,6 +486,7 @@ static void pc_xen_hvm_init(MachineState *machine)
>   bus = pci_find_primary_bus();
>   if (bus != NULL) {
>   pci_create_simple(bus, -1, "xen-platform");
> +xen_igd_passthrough_isa_bridge_create(bus);
>   }
>   }
>   #endif
> >>>
> >>>Can't we defer this step until the GPU is added?
> >>
> >>Sounds great but I can't figure out where we can to do this exactly.
> >>
> >>>This way there won't be need to poke at host device
> >>>directly, you could get all info from dev->config
> >>>of the host device.
> >>
> >>As I understand We have two steps here:
> >>
> >>#1 At first I have to write something to check if we're registering 00:02.0
> >>& IGD, right? But where? While registering each pci device?
> >
> >In xen_pt_initfn.
> >Just check the device and vendor ID against the table you have.
> >
> 
> Okay. Please see the follows which is just compiled:
> 
> diff --git a/hw/xen/xen_pt.c b/hw/xen/xen_pt.c
> index c6466dc..f3ea313 100644
> --- a/hw/xen/xen_pt.c
> +++ b/hw/xen/xen_pt.c
> @@ -632,6 +632,94 @@ static const MemoryListener xen_pt_io_listener = {
>  .priority = 10,
>  };
> 
> +typedef struct {
> +uint16_t gpu_device_id;
> +uint16_t pch_device_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}, /* HSWGT1D, HSWD_w7 */
> +{0x0406, 0x8c4e}, /* HSWGT1M, HSWM_w7 */
> +{0x0412, 0x8c4e}, /* HSWGT2D, HSWD_w7 */
> +{0x0416, 0x8c4e}, /* HSWGT2M, HSWM_w7 */
> +{0x041E, 0x8c4e}, /* HSWGT15D, HSWD_w7 */
> +/* HSW ULT */
> +{0x0A06, 0x8c4e}, /* HSWGT1UT, HSWM_w7 */
> +{0x0A16, 0x8c4e}, /* HSWGT2UT, HSWM_w7 */
> +{0x0A26, 0x8c4e}, /* HSWGT3UT, HSWM_w7 */
> +{0x0A2E, 0x8c4e}, /* HSWGT3UT28W, HSWM_w7 */
> +{0x0A1E, 0x8c4e}, /* HSWGT2UX, HSWM_w7 */
> +{0x0A0E, 0x8c4e}, /* HSWGT1ULX, HSWM_w7 */
> +/* HSW CRW */
> +{0x0D26, 0x8c4e}, /* HSWGT3CW, HSWM_w7 */
> 

Re: [Qemu-devel] [RFC][PATCH 2/2] xen:i386:pc_piix: create isa bridge specific to IGD passthrough

2014-11-17 Thread Chen, Tiejun

On 2014/11/17 14:10, Michael S. Tsirkin wrote:

On Mon, Nov 17, 2014 at 10:47:56AM +0800, Chen, Tiejun wrote:

On 2014/11/5 22:09, Michael S. Tsirkin wrote:

On Wed, Nov 05, 2014 at 03:22:59PM +0800, Tiejun Chen wrote:

Currently IGD drivers always need to access PCH by 1f.0, and
PCH vendor/device id is used to identify the card.

Signed-off-by: Tiejun Chen 
---
  hw/i386/pc_piix.c | 28 +++-
  1 file changed, 27 insertions(+), 1 deletion(-)

diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
index b559181..b19c7a9 100644
--- a/hw/i386/pc_piix.c
+++ b/hw/i386/pc_piix.c
@@ -50,7 +50,7 @@
  #include "cpu.h"
  #include "qemu/error-report.h"
  #ifdef CONFIG_XEN
-#  include 
+#include 
  #endif

  #define MAX_IDE_BUS 2
@@ -452,6 +452,31 @@ static void pc_init_isa(MachineState *machine)
  }

  #ifdef CONFIG_XEN
+static void xen_igd_passthrough_isa_bridge_create(PCIBus *bus)
+{
+struct PCIDevice *dev;
+Error *local_err = NULL;
+uint16_t device_id = 0x;
+
+/* Currently IGD drivers always need to access PCH by 1f.0. */
+dev = pci_create_simple(bus, PCI_DEVFN(0x1f, 0),
+"xen-igd-passthrough-isa-bridge");
+
+/* Identify PCH card with its own real vendor/device ids.
+ * Here that vendor id is always PCI_VENDOR_ID_INTEL.
+ */
+if (dev) {
+device_id = object_property_get_int(OBJECT(dev), "device-id",
+&local_err);
+if (!local_err && device_id != 0x) {
+pci_config_set_device_id(dev->config, device_id);
+return;
+}
+}
+
+fprintf(stderr, "xen set xen-igd-passthrough-isa-bridge failed\n");
+}
+
  static void pc_xen_hvm_init(MachineState *machine)
  {
  PCIBus *bus;
@@ -461,6 +486,7 @@ static void pc_xen_hvm_init(MachineState *machine)
  bus = pci_find_primary_bus();
  if (bus != NULL) {
  pci_create_simple(bus, -1, "xen-platform");
+xen_igd_passthrough_isa_bridge_create(bus);
  }
  }
  #endif


Can't we defer this step until the GPU is added?


Sounds great but I can't figure out where we can to do this exactly.


This way there won't be need to poke at host device
directly, you could get all info from dev->config
of the host device.


As I understand We have two steps here:

#1 At first I have to write something to check if we're registering 00:02.0
& IGD, right? But where? While registering each pci device?


In xen_pt_initfn.
Just check the device and vendor ID against the table you have.



Okay. Please see the follows which is just compiled:

diff --git a/hw/xen/xen_pt.c b/hw/xen/xen_pt.c
index c6466dc..f3ea313 100644
--- a/hw/xen/xen_pt.c
+++ b/hw/xen/xen_pt.c
@@ -632,6 +632,94 @@ static const MemoryListener xen_pt_io_listener = {
 .priority = 10,
 };

+typedef struct {
+uint16_t gpu_device_id;
+uint16_t pch_device_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}, /* HSWGT1D, HSWD_w7 */
+{0x0406, 0x8c4e}, /* HSWGT1M, HSWM_w7 */
+{0x0412, 0x8c4e}, /* HSWGT2D, HSWD_w7 */
+{0x0416, 0x8c4e}, /* HSWGT2M, HSWM_w7 */
+{0x041E, 0x8c4e}, /* HSWGT15D, HSWD_w7 */
+/* HSW ULT */
+{0x0A06, 0x8c4e}, /* HSWGT1UT, HSWM_w7 */
+{0x0A16, 0x8c4e}, /* HSWGT2UT, HSWM_w7 */
+{0x0A26, 0x8c4e}, /* HSWGT3UT, HSWM_w7 */
+{0x0A2E, 0x8c4e}, /* HSWGT3UT28W, HSWM_w7 */
+{0x0A1E, 0x8c4e}, /* HSWGT2UX, HSWM_w7 */
+{0x0A0E, 0x8c4e}, /* HSWGT1ULX, HSWM_w7 */
+/* HSW CRW */
+{0x0D26, 0x8c4e}, /* HSWGT3CW, HSWM_w7 */
+{0x0D22, 0x8c4e}, /* HSWGT3CWDT, HSWD_w7 */
+/* HSW Server */
+{0x041A, 0x8c4e}, /* HSWSVGT2, HSWD_w7 */
+/* HSW SRVR */
+{0x040A, 0x8c4e}, /* HSWSVGT1, HSWD_w7 */
+/* BSW */
+{0x1606, 0x9cc3}, /* BDWULTGT1, BDWM_w7 */
+{0x1616, 0x9cc3}, /* BDWULTGT2, BDWM_w7 */
+{0x1626, 0x9cc3}, /* BDWULTGT3, BDWM_w7 */
+{0x160E, 0x9cc3}, /* BDWULXGT1, BDWM_w7 */
+{0x161E, 0x9cc3}, /* BDWULXGT2, BDWM_w7 */
+{0x1602, 0x9cc3}, /* BDWHALOGT1, BDWM_w7 */
+{0x1612, 0x9cc3}, /* BDWHALOGT2, BDWM_w7 */
+{0x1622, 0x9cc3}, /* BDWHALOGT3, BDWM_w7 */
+{0x1

Re: [Qemu-devel] [RFC][PATCH 2/2] xen:i386:pc_piix: create isa bridge specific to IGD passthrough

2014-11-16 Thread Michael S. Tsirkin
On Mon, Nov 17, 2014 at 10:47:56AM +0800, Chen, Tiejun wrote:
> On 2014/11/5 22:09, Michael S. Tsirkin wrote:
> >On Wed, Nov 05, 2014 at 03:22:59PM +0800, Tiejun Chen wrote:
> >>Currently IGD drivers always need to access PCH by 1f.0, and
> >>PCH vendor/device id is used to identify the card.
> >>
> >>Signed-off-by: Tiejun Chen 
> >>---
> >>  hw/i386/pc_piix.c | 28 +++-
> >>  1 file changed, 27 insertions(+), 1 deletion(-)
> >>
> >>diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
> >>index b559181..b19c7a9 100644
> >>--- a/hw/i386/pc_piix.c
> >>+++ b/hw/i386/pc_piix.c
> >>@@ -50,7 +50,7 @@
> >>  #include "cpu.h"
> >>  #include "qemu/error-report.h"
> >>  #ifdef CONFIG_XEN
> >>-#  include 
> >>+#include 
> >>  #endif
> >>
> >>  #define MAX_IDE_BUS 2
> >>@@ -452,6 +452,31 @@ static void pc_init_isa(MachineState *machine)
> >>  }
> >>
> >>  #ifdef CONFIG_XEN
> >>+static void xen_igd_passthrough_isa_bridge_create(PCIBus *bus)
> >>+{
> >>+struct PCIDevice *dev;
> >>+Error *local_err = NULL;
> >>+uint16_t device_id = 0x;
> >>+
> >>+/* Currently IGD drivers always need to access PCH by 1f.0. */
> >>+dev = pci_create_simple(bus, PCI_DEVFN(0x1f, 0),
> >>+"xen-igd-passthrough-isa-bridge");
> >>+
> >>+/* Identify PCH card with its own real vendor/device ids.
> >>+ * Here that vendor id is always PCI_VENDOR_ID_INTEL.
> >>+ */
> >>+if (dev) {
> >>+device_id = object_property_get_int(OBJECT(dev), "device-id",
> >>+&local_err);
> >>+if (!local_err && device_id != 0x) {
> >>+pci_config_set_device_id(dev->config, device_id);
> >>+return;
> >>+}
> >>+}
> >>+
> >>+fprintf(stderr, "xen set xen-igd-passthrough-isa-bridge failed\n");
> >>+}
> >>+
> >>  static void pc_xen_hvm_init(MachineState *machine)
> >>  {
> >>  PCIBus *bus;
> >>@@ -461,6 +486,7 @@ static void pc_xen_hvm_init(MachineState *machine)
> >>  bus = pci_find_primary_bus();
> >>  if (bus != NULL) {
> >>  pci_create_simple(bus, -1, "xen-platform");
> >>+xen_igd_passthrough_isa_bridge_create(bus);
> >>  }
> >>  }
> >>  #endif
> >
> >Can't we defer this step until the GPU is added?
> 
> Sounds great but I can't figure out where we can to do this exactly.
> 
> >This way there won't be need to poke at host device
> >directly, you could get all info from dev->config
> >of the host device.
> 
> As I understand We have two steps here:
> 
> #1 At first I have to write something to check if we're registering 00:02.0
> & IGD, right? But where? While registering each pci device?

In xen_pt_initfn.
Just check the device and vendor ID against the table you have.


> #2 Then if that condition is matched, we register this ISA bridge on its
> associated bus.
> 
> Thanks
> Tiejun

Yep.

> >Additionally the correct bridge would be initialized automatically.
> >
> >
> >>--
> >>1.9.1
> >



Re: [Qemu-devel] [RFC][PATCH 2/2] xen:i386:pc_piix: create isa bridge specific to IGD passthrough

2014-11-16 Thread Chen, Tiejun

On 2014/11/5 22:09, Michael S. Tsirkin wrote:

On Wed, Nov 05, 2014 at 03:22:59PM +0800, Tiejun Chen wrote:

Currently IGD drivers always need to access PCH by 1f.0, and
PCH vendor/device id is used to identify the card.

Signed-off-by: Tiejun Chen 
---
  hw/i386/pc_piix.c | 28 +++-
  1 file changed, 27 insertions(+), 1 deletion(-)

diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
index b559181..b19c7a9 100644
--- a/hw/i386/pc_piix.c
+++ b/hw/i386/pc_piix.c
@@ -50,7 +50,7 @@
  #include "cpu.h"
  #include "qemu/error-report.h"
  #ifdef CONFIG_XEN
-#  include 
+#include 
  #endif

  #define MAX_IDE_BUS 2
@@ -452,6 +452,31 @@ static void pc_init_isa(MachineState *machine)
  }

  #ifdef CONFIG_XEN
+static void xen_igd_passthrough_isa_bridge_create(PCIBus *bus)
+{
+struct PCIDevice *dev;
+Error *local_err = NULL;
+uint16_t device_id = 0x;
+
+/* Currently IGD drivers always need to access PCH by 1f.0. */
+dev = pci_create_simple(bus, PCI_DEVFN(0x1f, 0),
+"xen-igd-passthrough-isa-bridge");
+
+/* Identify PCH card with its own real vendor/device ids.
+ * Here that vendor id is always PCI_VENDOR_ID_INTEL.
+ */
+if (dev) {
+device_id = object_property_get_int(OBJECT(dev), "device-id",
+&local_err);
+if (!local_err && device_id != 0x) {
+pci_config_set_device_id(dev->config, device_id);
+return;
+}
+}
+
+fprintf(stderr, "xen set xen-igd-passthrough-isa-bridge failed\n");
+}
+
  static void pc_xen_hvm_init(MachineState *machine)
  {
  PCIBus *bus;
@@ -461,6 +486,7 @@ static void pc_xen_hvm_init(MachineState *machine)
  bus = pci_find_primary_bus();
  if (bus != NULL) {
  pci_create_simple(bus, -1, "xen-platform");
+xen_igd_passthrough_isa_bridge_create(bus);
  }
  }
  #endif


Can't we defer this step until the GPU is added?


Sounds great but I can't figure out where we can to do this exactly.


This way there won't be need to poke at host device
directly, you could get all info from dev->config
of the host device.


As I understand We have two steps here:

#1 At first I have to write something to check if we're registering 
00:02.0 & IGD, right? But where? While registering each pci device?


#2 Then if that condition is matched, we register this ISA bridge on its 
associated bus.


Thanks
Tiejun


Additionally the correct bridge would be initialized automatically.



--
1.9.1






Re: [Qemu-devel] [RFC][PATCH 2/2] xen:i386:pc_piix: create isa bridge specific to IGD passthrough

2014-11-05 Thread Michael S. Tsirkin
On Wed, Nov 05, 2014 at 03:22:59PM +0800, Tiejun Chen wrote:
> Currently IGD drivers always need to access PCH by 1f.0, and
> PCH vendor/device id is used to identify the card.
> 
> Signed-off-by: Tiejun Chen 
> ---
>  hw/i386/pc_piix.c | 28 +++-
>  1 file changed, 27 insertions(+), 1 deletion(-)
> 
> diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
> index b559181..b19c7a9 100644
> --- a/hw/i386/pc_piix.c
> +++ b/hw/i386/pc_piix.c
> @@ -50,7 +50,7 @@
>  #include "cpu.h"
>  #include "qemu/error-report.h"
>  #ifdef CONFIG_XEN
> -#  include 
> +#include 
>  #endif
>  
>  #define MAX_IDE_BUS 2
> @@ -452,6 +452,31 @@ static void pc_init_isa(MachineState *machine)
>  }
>  
>  #ifdef CONFIG_XEN
> +static void xen_igd_passthrough_isa_bridge_create(PCIBus *bus)
> +{
> +struct PCIDevice *dev;
> +Error *local_err = NULL;
> +uint16_t device_id = 0x;
> +
> +/* Currently IGD drivers always need to access PCH by 1f.0. */
> +dev = pci_create_simple(bus, PCI_DEVFN(0x1f, 0),
> +"xen-igd-passthrough-isa-bridge");
> +
> +/* Identify PCH card with its own real vendor/device ids.
> + * Here that vendor id is always PCI_VENDOR_ID_INTEL.
> + */
> +if (dev) {
> +device_id = object_property_get_int(OBJECT(dev), "device-id",
> +&local_err);
> +if (!local_err && device_id != 0x) {
> +pci_config_set_device_id(dev->config, device_id);
> +return;
> +}
> +}
> +
> +fprintf(stderr, "xen set xen-igd-passthrough-isa-bridge failed\n");
> +}
> +
>  static void pc_xen_hvm_init(MachineState *machine)
>  {
>  PCIBus *bus;
> @@ -461,6 +486,7 @@ static void pc_xen_hvm_init(MachineState *machine)
>  bus = pci_find_primary_bus();
>  if (bus != NULL) {
>  pci_create_simple(bus, -1, "xen-platform");
> +xen_igd_passthrough_isa_bridge_create(bus);
>  }
>  }
>  #endif

Can't we defer this step until the GPU is added?
This way there won't be need to poke at host device
directly, you could get all info from dev->config
of the host device.
Additionally the correct bridge would be initialized automatically.


> -- 
> 1.9.1



[Qemu-devel] [RFC][PATCH 2/2] xen:i386:pc_piix: create isa bridge specific to IGD passthrough

2014-11-04 Thread Tiejun Chen
Currently IGD drivers always need to access PCH by 1f.0, and
PCH vendor/device id is used to identify the card.

Signed-off-by: Tiejun Chen 
---
 hw/i386/pc_piix.c | 28 +++-
 1 file changed, 27 insertions(+), 1 deletion(-)

diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
index b559181..b19c7a9 100644
--- a/hw/i386/pc_piix.c
+++ b/hw/i386/pc_piix.c
@@ -50,7 +50,7 @@
 #include "cpu.h"
 #include "qemu/error-report.h"
 #ifdef CONFIG_XEN
-#  include 
+#include 
 #endif
 
 #define MAX_IDE_BUS 2
@@ -452,6 +452,31 @@ static void pc_init_isa(MachineState *machine)
 }
 
 #ifdef CONFIG_XEN
+static void xen_igd_passthrough_isa_bridge_create(PCIBus *bus)
+{
+struct PCIDevice *dev;
+Error *local_err = NULL;
+uint16_t device_id = 0x;
+
+/* Currently IGD drivers always need to access PCH by 1f.0. */
+dev = pci_create_simple(bus, PCI_DEVFN(0x1f, 0),
+"xen-igd-passthrough-isa-bridge");
+
+/* Identify PCH card with its own real vendor/device ids.
+ * Here that vendor id is always PCI_VENDOR_ID_INTEL.
+ */
+if (dev) {
+device_id = object_property_get_int(OBJECT(dev), "device-id",
+&local_err);
+if (!local_err && device_id != 0x) {
+pci_config_set_device_id(dev->config, device_id);
+return;
+}
+}
+
+fprintf(stderr, "xen set xen-igd-passthrough-isa-bridge failed\n");
+}
+
 static void pc_xen_hvm_init(MachineState *machine)
 {
 PCIBus *bus;
@@ -461,6 +486,7 @@ static void pc_xen_hvm_init(MachineState *machine)
 bus = pci_find_primary_bus();
 if (bus != NULL) {
 pci_create_simple(bus, -1, "xen-platform");
+xen_igd_passthrough_isa_bridge_create(bus);
 }
 }
 #endif
-- 
1.9.1