[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [PATCH] ioemu: fix PCI ROM handling problem in passthrough



The ROM BAR doesn't get updated after writing '1' to the
/sys/bus/pci/devices/.../rom which causes ROM mapping problem.

This fix makes the ROM enabling revert to old mechanism (write
ROM BAR directly).

Kouya, thank you for testing the fix!


Reported-by: Kouya Shimura <kouya@xxxxxxxxxxxxxx>
Tested-by: Kouya Shimura <kouya@xxxxxxxxxxxxxx>
Signed-off-by: Yu Zhao <yu.zhao@xxxxxxxxx>
---
 hw/pass-through.c |   37 ++++++++++---------------------------
 1 files changed, 10 insertions(+), 27 deletions(-)

diff --git a/hw/pass-through.c b/hw/pass-through.c
index e76a3c3..f24eee1 100644
--- a/hw/pass-through.c
+++ b/hw/pass-through.c
@@ -1447,27 +1447,6 @@ exit:
     return val;
 }
 
-static int pt_pci_enable_rom(struct pci_dev *dev)
-{
-    FILE *fp;
-    char path[PATH_MAX];
-
-    sprintf(path, "/sys/bus/pci/devices/%04x:%02x:%02x.%x/rom",
-            dev->domain, dev->bus, dev->dev, dev->func);
-
-    fp = fopen(path, "w");
-    if ( !fp )
-    {
-        PT_LOG("Can't open %s: %s\n", path, strerror(errno));
-        return -1;
-    }
-
-    fprintf(fp, "1");
-    fclose(fp);
-
-    return 0;
-}
-
 static void pt_libpci_fixup(struct pci_dev *dev)
 {
 #if PCI_LIB_VERSION < 0x030100
@@ -1508,6 +1487,7 @@ static void pt_libpci_fixup(struct pci_dev *dev)
 static int pt_register_regions(struct pt_dev *assigned_device)
 {
     int i = 0;
+    uint32_t bar_data = 0;
     struct pci_dev *pci_dev = assigned_device->pci_dev;
     PCIDevice *d = &assigned_device->dev;
 
@@ -1542,18 +1522,21 @@ static int pt_register_regions(struct pt_dev 
*assigned_device)
     }
 
     /* Register expansion ROM address */
-    if ( pt_pci_base_addr(pci_dev->rom_base_addr) && pci_dev->rom_size )
+    if ( (pci_dev->rom_base_addr & PCI_ROM_ADDRESS_MASK) && pci_dev->rom_size )
     {
 
         /* Re-set BAR reported by OS, otherwise ROM can't be read. */
-        if ( (pci_dev->rom_base_addr & PCI_ROM_ADDRESS_MASK) == 0 )
-            if ( pt_pci_enable_rom(pci_dev) )
-                return -1;
+        bar_data = pci_read_long(pci_dev, PCI_ROM_ADDRESS);
+        if ( (bar_data & PCI_ROM_ADDRESS_MASK) == 0 )
+        {
+            bar_data |= (pci_dev->rom_base_addr & PCI_ROM_ADDRESS_MASK);
+            pci_write_long(pci_dev, PCI_ROM_ADDRESS, bar_data);
+        }
 
         assigned_device->bases[PCI_ROM_SLOT].e_physbase =
-            pci_dev->rom_base_addr;
+            pci_dev->rom_base_addr & PCI_ROM_ADDRESS_MASK;
         assigned_device->bases[PCI_ROM_SLOT].access.maddr =
-            pci_dev->rom_base_addr;
+            pci_dev->rom_base_addr & PCI_ROM_ADDRESS_MASK;
         pci_register_io_region((PCIDevice *)assigned_device, PCI_ROM_SLOT,
             pci_dev->rom_size, PCI_ADDRESS_SPACE_MEM_PREFETCH,
             pt_iomem_map);
-- 
1.5.6.4


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


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.