mirror of https://github.com/xemu-project/xemu.git
s390x/pci: PCI multibus bridge handling
When the hotplug handler detects a PCI bridge, the secondary bus has been initialized by the core PCI code. We give the secondary bus the bridge name and associate to it the IOMMU handling and hotplug/hotunplug callbacks. Signed-off-by: Pierre Morel <pmorel@linux.vnet.ibm.com> Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com>
This commit is contained in:
parent
a975a24aed
commit
3fc92a24f3
|
@ -19,6 +19,7 @@
|
||||||
#include "s390-pci-bus.h"
|
#include "s390-pci-bus.h"
|
||||||
#include "s390-pci-inst.h"
|
#include "s390-pci-inst.h"
|
||||||
#include "hw/pci/pci_bus.h"
|
#include "hw/pci/pci_bus.h"
|
||||||
|
#include "hw/pci/pci_bridge.h"
|
||||||
#include "hw/pci/msi.h"
|
#include "hw/pci/msi.h"
|
||||||
#include "qemu/error-report.h"
|
#include "qemu/error-report.h"
|
||||||
|
|
||||||
|
@ -677,7 +678,16 @@ static void s390_pcihost_hot_plug(HotplugHandler *hotplug_dev,
|
||||||
S390PCIBusDevice *pbdev = NULL;
|
S390PCIBusDevice *pbdev = NULL;
|
||||||
S390pciState *s = s390_get_phb();
|
S390pciState *s = s390_get_phb();
|
||||||
|
|
||||||
if (object_dynamic_cast(OBJECT(dev), TYPE_PCI_DEVICE)) {
|
if (object_dynamic_cast(OBJECT(dev), TYPE_PCI_BRIDGE)) {
|
||||||
|
BusState *bus;
|
||||||
|
PCIBridge *pb = PCI_BRIDGE(dev);
|
||||||
|
|
||||||
|
pci_bridge_map_irq(pb, dev->id, s390_pci_map_irq);
|
||||||
|
pci_setup_iommu(&pb->sec_bus, s390_pci_dma_iommu, s);
|
||||||
|
|
||||||
|
bus = BUS(&pb->sec_bus);
|
||||||
|
qbus_set_hotplug_handler(bus, DEVICE(s), errp);
|
||||||
|
} else if (object_dynamic_cast(OBJECT(dev), TYPE_PCI_DEVICE)) {
|
||||||
pdev = PCI_DEVICE(dev);
|
pdev = PCI_DEVICE(dev);
|
||||||
|
|
||||||
if (!dev->id) {
|
if (!dev->id) {
|
||||||
|
@ -754,7 +764,10 @@ static void s390_pcihost_hot_unplug(HotplugHandler *hotplug_dev,
|
||||||
S390PCIBusDevice *pbdev = NULL;
|
S390PCIBusDevice *pbdev = NULL;
|
||||||
S390pciState *s = s390_get_phb();
|
S390pciState *s = s390_get_phb();
|
||||||
|
|
||||||
if (object_dynamic_cast(OBJECT(dev), TYPE_PCI_DEVICE)) {
|
if (object_dynamic_cast(OBJECT(dev), TYPE_PCI_BRIDGE)) {
|
||||||
|
error_setg(errp, "PCI bridge hot unplug currently not supported");
|
||||||
|
return;
|
||||||
|
} else if (object_dynamic_cast(OBJECT(dev), TYPE_PCI_DEVICE)) {
|
||||||
pci_dev = PCI_DEVICE(dev);
|
pci_dev = PCI_DEVICE(dev);
|
||||||
|
|
||||||
QTAILQ_FOREACH(pbdev, &s->zpci_devs, link) {
|
QTAILQ_FOREACH(pbdev, &s->zpci_devs, link) {
|
||||||
|
|
Loading…
Reference in New Issue