]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
xen/pciback: Restore the PCI config space after an FLR.
authorKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Tue, 25 Sep 2012 20:48:24 +0000 (16:48 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 7 Oct 2012 15:35:55 +0000 (08:35 -0700)
commit c341ca45ce56143804ef5a8f4db753e554e640b4 upstream.

When we do an FLR, or D0->D3_hot we may lose the BARs as the
device has turned itself off (and on). This means the device cannot
function unless the pci_restore_state is called - which it is
when the PCI device is unbound from the Xen PCI backend driver.
For PV guests it ends up calling pci_enable_device / pci_enable_msi[x]
which does the proper steps

That however is not happening if a HVM guest is run as QEMU
deals with PCI configuration space. QEMU also requires that the
device be "parked"  under the ownership of a pci-stub driver to
guarantee that the PCI device is not being used. Hence we
follow the same incantation as pci_reset_function does - by
doing an FLR, then restoring the PCI configuration space.

The result of this patch is that when you run lspci, you get
now this:

-       Region 0: [virtual] Memory at fe8c0000 (32-bit, non-prefetchable) [size=128K]
-       Region 1: [virtual] Memory at fe800000 (32-bit, non-prefetchable) [size=512K]
+       Region 0: Memory at fe8c0000 (32-bit, non-prefetchable) [size=128K]
+       Region 1: Memory at fe800000 (32-bit, non-prefetchable) [size=512K]
        Region 2: I/O ports at c000 [size=32]
-       Region 3: [virtual] Memory at fe8e0000 (32-bit, non-prefetchable) [size=16K]
+       Region 3: Memory at fe8e0000 (32-bit, non-prefetchable) [size=16K]

The [virtual] means that lspci read those entries from SysFS but when
it read them from the device it got a different value (0xfffffff).

Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/xen/xen-pciback/pci_stub.c

index 03342728bf2352ff751f21c333b58bd5cb8756b6..77c9f769daddad971c122d85f4730380d14e68de 100644 (file)
@@ -362,6 +362,7 @@ static int __devinit pcistub_init_device(struct pci_dev *dev)
        else {
                dev_dbg(&dev->dev, "reseting (FLR, D3, etc) the device\n");
                __pci_reset_function_locked(dev);
+               pci_restore_state(dev);
        }
        /* Now disable the device (this also ensures some private device
         * data is setup before we export)