• Konrad Rzeszutek Wilk's avatar
    xen/pciback: Restore the PCI config space after an FLR. · c341ca45
    Konrad Rzeszutek Wilk authored
    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).
    
    CC: stable@vger.kernel.org #only for 3.5, 3.6
    Signed-off-by: default avatarKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>
    c341ca45
pci_stub.c 36.6 KB