xen-devel.lists.xenproject.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 1/2] qemu-xen: Pass through, utility functions
@ 2012-01-31 18:39 Jean Guyader
  2012-01-31 18:39 ` [PATCH 2/2] qemu-xen: Intel GPU passthrough Jean Guyader
  2012-02-01 14:47 ` [PATCH 1/2] qemu-xen: Pass through, utility functions Stefano Stabellini
  0 siblings, 2 replies; 7+ messages in thread
From: Jean Guyader @ 2012-01-31 18:39 UTC (permalink / raw)
  To: xen-devel; +Cc: Ian.Jackson, allen.m.kay, Jean Guyader

[-- Attachment #1: Type: text/plain, Size: 380 bytes --]


Add a function to map a specific bar into a pt_dev.

Add a function that gets called everytime the bar of a pass
through device gets remap.

Signed-off-by: Jean Guyader <jean.guyader@eu.citrix.com>
---
 hw/pass-through.c |   34 ++++++++++++++++++++++++++++++++++
 hw/pass-through.h |    3 +++
 hw/pt-graphics.c  |    7 +++++++
 3 files changed, 44 insertions(+), 0 deletions(-)


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-qemu-xen-Pass-through-utility-functions.patch --]
[-- Type: text/x-patch; name="0001-qemu-xen-Pass-through-utility-functions.patch", Size: 3801 bytes --]

diff --git a/hw/pass-through.c b/hw/pass-through.c
index dbe8804..1bdb223 100644
--- a/hw/pass-through.c
+++ b/hw/pass-through.c
@@ -93,6 +93,7 @@
 #include <unistd.h>
 #include <sys/ioctl.h>
 #include <assert.h>
+#include <sys/mman.h>
 
 extern int gfx_passthru;
 int igd_passthru = 0;
@@ -1155,6 +1156,9 @@ static void pt_iomem_map(PCIDevice *d, int i, uint32_t e_phys, uint32_t e_size,
     if ( e_size == 0 )
         return;
 
+    if (assigned_device->pci_dev->device_class == 0x0300)
+        pt_graphic_bar_remap(assigned_device, i, first_map, DPCI_ADD_MAPPING);
+
     if ( !first_map && old_ebase != -1 )
     {
         if ( has_msix_mapping(assigned_device, i) )
@@ -1969,6 +1973,9 @@ static void pt_unregister_regions(struct pt_dev *assigned_device)
         if ( type == PCI_ADDRESS_SPACE_MEM ||
              type == PCI_ADDRESS_SPACE_MEM_PREFETCH )
         {
+            if (assigned_device->pci_dev->device_class == 0x0300)
+                pt_graphic_bar_remap(assigned_device, i, 0, DPCI_REMOVE_MAPPING);
+
             ret = xc_domain_memory_mapping(xc_handle, domid,
                     assigned_device->bases[i].e_physbase >> XC_PAGE_SHIFT,
                     assigned_device->bases[i].access.maddr >> XC_PAGE_SHIFT,
@@ -2101,6 +2108,33 @@ int pt_pci_host_write(struct pci_dev *pci_dev, u32 addr, u32 val, int len)
     return ret;
 }
 
+int pt_pci_host_map_bar(struct pt_dev *pt_dev, int bar)
+{
+    int fd;
+    struct stat s;
+    uint8_t *map;
+
+    char filename[1024];
+
+    snprintf(filename, 1024, "/sys/bus/pci/devices/0000:%02x:%02x.%01x/resource%d",
+            pt_dev->pci_dev->bus,
+            pt_dev->pci_dev->dev,
+            pt_dev->pci_dev->func,
+            bar);
+    fd = open(filename, O_RDWR | O_SYNC);
+    if (fd < 0)
+        return fd;
+    fstat(fd, &s);
+
+    map = mmap(0, s.st_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
+    if (map != MAP_FAILED)
+    {
+        pt_dev->bases[bar].map = map;
+        return 0;
+    }
+    return errno;
+}
+
 /* parse BAR */
 static int pt_bar_reg_parse(
         struct pt_dev *ptdev, struct pt_reg_info_tbl *reg)
diff --git a/hw/pass-through.h b/hw/pass-through.h
index 884139c..26e6ff1 100644
--- a/hw/pass-through.h
+++ b/hw/pass-through.h
@@ -170,6 +170,7 @@ struct pt_region {
         uint64_t pio_base;
         uint64_t u;
     } access;
+    uint8_t *map;
 };
 
 struct pt_msi_info {
@@ -414,6 +415,7 @@ uint8_t pci_intx(struct pt_dev *ptdev);
 struct pci_dev *pt_pci_get_dev(int bus, int dev, int func);
 u32 pt_pci_host_read(struct pci_dev *pci_dev, u32 addr, int len);
 int pt_pci_host_write(struct pci_dev *pci_dev, u32 addr, u32 val, int len);
+int pt_pci_host_map_bar(struct pt_dev *pt_dev, int bar);
 void intel_pch_init(PCIBus *bus);
 int register_vga_regions(struct pt_dev *real_device);
 int unregister_vga_regions(struct pt_dev *real_device);
@@ -422,6 +424,7 @@ PCIBus *intel_pci_bridge_init(PCIBus *bus, int devfn, uint16_t vid,
            uint16_t did, const char *name, uint16_t revision);
 void igd_pci_write(PCIDevice *pci_dev, uint32_t config_addr, uint32_t val, int len);
 uint32_t igd_pci_read(PCIDevice *pci_dev, uint32_t config_addr, int len);
+void pt_graphic_bar_remap(struct pt_dev *real_device, int bar, int first_map, int map);
 
 #endif /* __PASSTHROUGH_H__ */
 
diff --git a/hw/pt-graphics.c b/hw/pt-graphics.c
index fec7390..5d5e5da 100644
--- a/hw/pt-graphics.c
+++ b/hw/pt-graphics.c
@@ -94,6 +94,13 @@ uint32_t igd_pci_read(PCIDevice *pci_dev, uint32_t config_addr, int len)
 }
 
 /*
+ * Callback whenever a bar get remapped
+ */
+void pt_graphic_bar_remap(struct pt_dev *real_device, int bar, int first_map, int map)
+{
+}
+
+/*
  * register VGA resources for the domain with assigned gfx
  */
 int register_vga_regions(struct pt_dev *real_device)

[-- Attachment #3: Type: text/plain, Size: 138 bytes --]

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

^ permalink raw reply related	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2012-02-01 22:32 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-01-31 18:39 [PATCH 1/2] qemu-xen: Pass through, utility functions Jean Guyader
2012-01-31 18:39 ` [PATCH 2/2] qemu-xen: Intel GPU passthrough Jean Guyader
2012-02-01 14:52   ` Stefano Stabellini
2012-02-01 15:28     ` Jean Guyader
2012-02-01 22:32   ` Kay, Allen M
2012-02-01 14:47 ` [PATCH 1/2] qemu-xen: Pass through, utility functions Stefano Stabellini
2012-02-01 15:26   ` Jean Guyader

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).