From: Tiejun Chen <tiejun.chen@intel.com>
To: ian.campbell@citrix.com, wei.liu2@citrix.com,
Ian.Jackson@eu.citrix.com, stefano.stabellini@citrix.com
Cc: qemu-devel@nongnu.org, xen-devel@lists.xen.org
Subject: [Qemu-devel] [v3][PATCH 1/2] libxl: introduce libxl__is_igd_vga_passthru
Date: Mon, 23 Mar 2015 09:17:45 +0800 [thread overview]
Message-ID: <1427073466-16956-2-git-send-email-tiejun.chen@intel.com> (raw)
In-Reply-To: <1427073466-16956-1-git-send-email-tiejun.chen@intel.com>
While working with qemu, IGD is a specific device in the case of pass through
so we need to identify that to handle more later. Here we define a table to
record all IGD types currently we can support. Also we need to introduce two
helper functions to get vendor and device ids to lookup that table.
Signed-off-by: Tiejun Chen <tiejun.chen@intel.com>
Acked-by: Ian Campbell <ian.campbell@citrix.com>
---
tools/libxl/libxl_internal.h | 2 +
tools/libxl/libxl_pci.c | 124 +++++++++++++++++++++++++++++++++++++++++++
2 files changed, 126 insertions(+)
diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h
index 934465a..c97c62d 100644
--- a/tools/libxl/libxl_internal.h
+++ b/tools/libxl/libxl_internal.h
@@ -1176,6 +1176,8 @@ _hidden int libxl__device_pci_add(libxl__gc *gc, uint32_t domid, libxl_device_pc
_hidden int libxl__create_pci_backend(libxl__gc *gc, uint32_t domid,
libxl_device_pci *pcidev, int num);
_hidden int libxl__device_pci_destroy_all(libxl__gc *gc, uint32_t domid);
+_hidden bool libxl__is_igd_vga_passthru(libxl__gc *gc,
+ const libxl_domain_config *d_config);
/*----- xswait: wait for a xenstore node to be suitable -----*/
diff --git a/tools/libxl/libxl_pci.c b/tools/libxl/libxl_pci.c
index f3ae132..9a534cc 100644
--- a/tools/libxl/libxl_pci.c
+++ b/tools/libxl/libxl_pci.c
@@ -491,6 +491,130 @@ static int sysfs_dev_unbind(libxl__gc *gc, libxl_device_pci *pcidev,
return 0;
}
+static uint16_t sysfs_dev_get_vendor(libxl__gc *gc, libxl_device_pci *pcidev)
+{
+ char *pci_device_vendor_path =
+ GCSPRINTF(SYSFS_PCI_DEV"/"PCI_BDF"/vendor",
+ pcidev->domain, pcidev->bus, pcidev->dev, pcidev->func);
+ uint16_t read_items;
+ uint16_t pci_device_vendor;
+
+ FILE *f = fopen(pci_device_vendor_path, "r");
+ if (!f) {
+ LOGE(ERROR,
+ "pci device "PCI_BDF" does not have vendor attribute",
+ pcidev->domain, pcidev->bus, pcidev->dev, pcidev->func);
+ return 0xffff;
+ }
+ read_items = fscanf(f, "0x%hx\n", &pci_device_vendor);
+ fclose(f);
+ if (read_items != 1) {
+ LOGE(ERROR,
+ "cannot read vendor of pci device "PCI_BDF,
+ pcidev->domain, pcidev->bus, pcidev->dev, pcidev->func);
+ return 0xffff;
+ }
+
+ return pci_device_vendor;
+}
+
+static uint16_t sysfs_dev_get_device(libxl__gc *gc, libxl_device_pci *pcidev)
+{
+ char *pci_device_device_path =
+ GCSPRINTF(SYSFS_PCI_DEV"/"PCI_BDF"/device",
+ pcidev->domain, pcidev->bus, pcidev->dev, pcidev->func);
+ uint16_t read_items;
+ uint16_t pci_device_device;
+
+ FILE *f = fopen(pci_device_device_path, "r");
+ if (!f) {
+ LOGE(ERROR,
+ "pci device "PCI_BDF" does not have device attribute",
+ pcidev->domain, pcidev->bus, pcidev->dev, pcidev->func);
+ return 0xffff;
+ }
+ read_items = fscanf(f, "0x%hx\n", &pci_device_device);
+ fclose(f);
+ if (read_items != 1) {
+ LOGE(ERROR,
+ "cannot read device of pci device "PCI_BDF,
+ pcidev->domain, pcidev->bus, pcidev->dev, pcidev->func);
+ return 0xffff;
+ }
+
+ return pci_device_device;
+}
+
+typedef struct {
+ uint16_t vendor;
+ uint16_t device;
+} pci_info;
+
+static const pci_info fixup_ids[] = {
+ /* Intel HSW Classic */
+ {0x8086, 0x0402}, /* HSWGT1D, HSWD_w7 */
+ {0x8086, 0x0406}, /* HSWGT1M, HSWM_w7 */
+ {0x8086, 0x0412}, /* HSWGT2D, HSWD_w7 */
+ {0x8086, 0x0416}, /* HSWGT2M, HSWM_w7 */
+ {0x8086, 0x041E}, /* HSWGT15D, HSWD_w7 */
+ /* Intel HSW ULT */
+ {0x8086, 0x0A06}, /* HSWGT1UT, HSWM_w7 */
+ {0x8086, 0x0A16}, /* HSWGT2UT, HSWM_w7 */
+ {0x8086, 0x0A26}, /* HSWGT3UT, HSWM_w7 */
+ {0x8086, 0x0A2E}, /* HSWGT3UT28W, HSWM_w7 */
+ {0x8086, 0x0A1E}, /* HSWGT2UX, HSWM_w7 */
+ {0x8086, 0x0A0E}, /* HSWGT1ULX, HSWM_w7 */
+ /* Intel HSW CRW */
+ {0x8086, 0x0D26}, /* HSWGT3CW, HSWM_w7 */
+ {0x8086, 0x0D22}, /* HSWGT3CWDT, HSWD_w7 */
+ /* Intel HSW Server */
+ {0x8086, 0x041A}, /* HSWSVGT2, HSWD_w7 */
+ /* Intel HSW SRVR */
+ {0x8086, 0x040A}, /* HSWSVGT1, HSWD_w7 */
+ /* Intel BSW */
+ {0x8086, 0x1606}, /* BDWULTGT1, BDWM_w7 */
+ {0x8086, 0x1616}, /* BDWULTGT2, BDWM_w7 */
+ {0x8086, 0x1626}, /* BDWULTGT3, BDWM_w7 */
+ {0x8086, 0x160E}, /* BDWULXGT1, BDWM_w7 */
+ {0x8086, 0x161E}, /* BDWULXGT2, BDWM_w7 */
+ {0x8086, 0x1602}, /* BDWHALOGT1, BDWM_w7 */
+ {0x8086, 0x1612}, /* BDWHALOGT2, BDWM_w7 */
+ {0x8086, 0x1622}, /* BDWHALOGT3, BDWM_w7 */
+ {0x8086, 0x162B}, /* BDWHALO28W, BDWM_w7 */
+ {0x8086, 0x162A}, /* BDWGT3WRKS, BDWM_w7 */
+ {0x8086, 0x162D}, /* BDWGT3SRVR, BDWM_w7 */
+};
+
+/*
+ * Some devices may need some ways to work well. Here like IGD,
+ * we have to pass a specific option to qemu.
+ */
+bool libxl__is_igd_vga_passthru(libxl__gc *gc,
+ const libxl_domain_config *d_config)
+{
+ unsigned int i, j, num = ARRAY_SIZE(fixup_ids);
+ uint16_t vendor, device, pt_vendor, pt_device;
+
+ for (i = 0 ; i < d_config->num_pcidevs ; i++) {
+ libxl_device_pci *pcidev = &d_config->pcidevs[i];
+ pt_vendor = sysfs_dev_get_vendor(gc, pcidev);
+ pt_device = sysfs_dev_get_device(gc, pcidev);
+
+ if (pt_vendor == 0xffff || pt_device == 0xffff)
+ continue;
+
+ for (j = 0 ; j < num ; j++) {
+ vendor = fixup_ids[j].vendor;
+ device = fixup_ids[j].device;
+
+ if (pt_vendor == vendor && pt_device == device)
+ return true;
+ }
+ }
+
+ return false;
+}
+
/*
* A brief comment about slots. I don't know what slots are for; however,
* I have by experimentation determined:
--
1.9.1
next prev parent reply other threads:[~2015-03-23 1:19 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-03-23 1:17 [Qemu-devel] [v3][PATCH 0/2] libxl: try to support IGD passthrough for qemu upstream Tiejun Chen
2015-03-23 1:17 ` Tiejun Chen [this message]
2015-03-23 1:17 ` [Qemu-devel] [v3][PATCH 2/2] libxl: introduce gfx_passthru_kind Tiejun Chen
2015-03-24 8:47 ` [Qemu-devel] One question to lowlevel/xl/xl.c and lowlevel/xc/xc.c Chen, Tiejun
2015-03-24 9:51 ` Ian Campbell
2015-03-24 10:15 ` Chen, Tiejun
2015-03-24 10:20 ` Ian Campbell
2015-03-24 10:31 ` Chen, Tiejun
2015-03-24 10:40 ` Ian Campbell
2015-03-25 1:18 ` Chen, Tiejun
2015-03-25 10:26 ` Ian Campbell
2015-03-26 0:44 ` Chen, Tiejun
2015-03-24 14:50 ` [Qemu-devel] [v3][PATCH 2/2] libxl: introduce gfx_passthru_kind Ian Campbell
2015-03-25 1:10 ` Chen, Tiejun
2015-03-25 10:32 ` Ian Campbell
2015-03-26 0:53 ` Chen, Tiejun
2015-03-26 10:06 ` Ian Campbell
2015-03-27 1:29 ` Chen, Tiejun
2015-03-27 9:54 ` Ian Campbell
2015-03-30 1:28 ` Chen, Tiejun
2015-03-30 9:19 ` Ian Campbell
2015-04-01 1:05 ` Chen, Tiejun
2015-04-01 8:45 ` Ian Campbell
2015-04-01 9:18 ` Chen, Tiejun
2015-04-01 9:53 ` Ian Campbell
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1427073466-16956-2-git-send-email-tiejun.chen@intel.com \
--to=tiejun.chen@intel.com \
--cc=Ian.Jackson@eu.citrix.com \
--cc=ian.campbell@citrix.com \
--cc=qemu-devel@nongnu.org \
--cc=stefano.stabellini@citrix.com \
--cc=wei.liu2@citrix.com \
--cc=xen-devel@lists.xen.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).