[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 12/26] hw/pci-bridge/pcie_pci_bridge: properly handle
From: |
Michael S. Tsirkin |
Subject: |
[Qemu-devel] [PULL 12/26] hw/pci-bridge/pcie_pci_bridge: properly handle MSI unavailability case |
Date: |
Sun, 15 Oct 2017 06:23:19 +0300 |
From: Aleksandr Bezzubikov <address@hidden>
QEMU with the pcie-pci-bridge device crashes if the guest board doesn't support
MSI,
e.g. 'qemu-system-ppc64 -M prep -device pcie-pci-bridge'.
This is caused by wrong pcie-pci-bridge instantiation error handling. This
patch fixes this issue
by falling back to legacy INTx if MSI is not available.
Also set the bridge's 'msi' property default value to 'auto' in order to
trigger errors
only when user explicitly set msi=on.
Reported-by: Eduardo Habkost <address@hidden>
Signed-off-by: Aleksandr Bezzubikov <address@hidden>
Reviewed-by: Marcel Apfelbaum <address@hidden>
Tested-by: Thomas Huth <address@hidden>
Reviewed-by: Michael S. Tsirkin <address@hidden>
Signed-off-by: Michael S. Tsirkin <address@hidden>
---
hw/pci-bridge/pcie_pci_bridge.c | 24 ++++++++++++++++++------
1 file changed, 18 insertions(+), 6 deletions(-)
diff --git a/hw/pci-bridge/pcie_pci_bridge.c b/hw/pci-bridge/pcie_pci_bridge.c
index 9aa5cc3..da562fe 100644
--- a/hw/pci-bridge/pcie_pci_bridge.c
+++ b/hw/pci-bridge/pcie_pci_bridge.c
@@ -65,10 +65,18 @@ static void pcie_pci_bridge_realize(PCIDevice *d, Error
**errp)
goto aer_error;
}
+ Error *local_err = NULL;
if (pcie_br->msi != ON_OFF_AUTO_OFF) {
- rc = msi_init(d, 0, 1, true, true, errp);
+ rc = msi_init(d, 0, 1, true, true, &local_err);
if (rc < 0) {
- goto msi_error;
+ assert(rc == -ENOTSUP);
+ if (pcie_br->msi != ON_OFF_AUTO_ON) {
+ error_free(local_err);
+ } else {
+ /* failed to satisfy user's explicit request for MSI */
+ error_propagate(errp, local_err);
+ goto msi_error;
+ }
}
}
pci_register_bar(d, 0, PCI_BASE_ADDRESS_SPACE_MEMORY |
@@ -81,7 +89,7 @@ aer_error:
pm_error:
pcie_cap_exit(d);
cap_error:
- shpc_free(d);
+ shpc_cleanup(d, &pcie_br->shpc_bar);
error:
pci_bridge_exitfn(d);
}
@@ -98,7 +106,9 @@ static void pcie_pci_bridge_reset(DeviceState *qdev)
{
PCIDevice *d = PCI_DEVICE(qdev);
pci_bridge_reset(qdev);
- msi_reset(d);
+ if (msi_present(d)) {
+ msi_reset(d);
+ }
shpc_reset(d);
}
@@ -106,12 +116,14 @@ static void pcie_pci_bridge_write_config(PCIDevice *d,
uint32_t address, uint32_t val, int len)
{
pci_bridge_write_config(d, address, val, len);
- msi_write_config(d, address, val, len);
+ if (msi_present(d)) {
+ msi_write_config(d, address, val, len);
+ }
shpc_cap_write_config(d, address, val, len);
}
static Property pcie_pci_bridge_dev_properties[] = {
- DEFINE_PROP_ON_OFF_AUTO("msi", PCIEPCIBridge, msi, ON_OFF_AUTO_ON),
+ DEFINE_PROP_ON_OFF_AUTO("msi", PCIEPCIBridge, msi, ON_OFF_AUTO_AUTO),
DEFINE_PROP_END_OF_LIST(),
};
--
MST
- [Qemu-devel] [PULL 02/26] pci: Set err to errp directly rather than through error_propagate(), (continued)
- [Qemu-devel] [PULL 02/26] pci: Set err to errp directly rather than through error_propagate(), Michael S. Tsirkin, 2017/10/14
- [Qemu-devel] [PULL 03/26] fw_cfg: add write callback, Michael S. Tsirkin, 2017/10/14
- [Qemu-devel] [PULL 04/26] hw/misc: add vmcoreinfo device, Michael S. Tsirkin, 2017/10/14
- [Qemu-devel] [PULL 05/26] dump: add guest ELF note, Michael S. Tsirkin, 2017/10/14
- [Qemu-devel] [PULL 06/26] dump: update phys_base header field based on VMCOREINFO content, Michael S. Tsirkin, 2017/10/14
- [Qemu-devel] [PULL 07/26] kdump: set vmcoreinfo location, Michael S. Tsirkin, 2017/10/14
- [Qemu-devel] [PULL 08/26] scripts/dump-guest-memory.py: add vmcoreinfo, Michael S. Tsirkin, 2017/10/14
- [Qemu-devel] [PULL 09/26] MAINTAINERS: add Dump maintainers, Michael S. Tsirkin, 2017/10/14
- [Qemu-devel] [PULL 10/26] virtio/vhost: reset dev->log after syncing, Michael S. Tsirkin, 2017/10/14
- [Qemu-devel] [PULL 11/26] pci: allow 32-bit PCI IO accesses to pass through the PCI bridge, Michael S. Tsirkin, 2017/10/14
- [Qemu-devel] [PULL 12/26] hw/pci-bridge/pcie_pci_bridge: properly handle MSI unavailability case,
Michael S. Tsirkin <=
- [Qemu-devel] [PULL 13/26] virtio/pci/migration: Convert to VMState, Michael S. Tsirkin, 2017/10/14
- [Qemu-devel] [PULL 14/26] PCI: PCIe access should always be little endian, Michael S. Tsirkin, 2017/10/14
- [Qemu-devel] [PULL 15/26] pci: conventional-pci-device and pci-express-device interfaces, Michael S. Tsirkin, 2017/10/14
- [Qemu-devel] [PULL 16/26] pci: Add interface names to hybrid PCI devices, Michael S. Tsirkin, 2017/10/14
- [Qemu-devel] [PULL 17/26] pci: Add INTERFACE_PCIE_DEVICE to all PCIe devices, Michael S. Tsirkin, 2017/10/14
- [Qemu-devel] [PULL 19/26] xen/pt: Mark TYPE_XEN_PT_DEVICE as hybrid, Michael S. Tsirkin, 2017/10/14
- [Qemu-devel] [PULL 20/26] pci: Validate interfaces on base_class_init, Michael S. Tsirkin, 2017/10/14
- [Qemu-devel] [PULL 21/26] hw/gen_pcie_root_port: make IO RO 0 on IO disabled, Michael S. Tsirkin, 2017/10/14
- [Qemu-devel] [PULL 22/26] virtio: fix descriptor counting in virtqueue_pop, Michael S. Tsirkin, 2017/10/14
- [Qemu-devel] [PULL 24/26] isapc: Remove unnecessary migration compatibility code, Michael S. Tsirkin, 2017/10/14