|
@@ -190,7 +190,10 @@ void s390_pci_sclp_deconfigure(SCCB *sccb)
|
|
|
rc = SCLP_RC_NO_ACTION_REQUIRED;
|
|
|
break;
|
|
|
default:
|
|
|
- if (pbdev->summary_ind) {
|
|
|
+ if (pbdev->interp && (pbdev->fh & FH_MASK_ENABLE)) {
|
|
|
+ /* Interpreted devices were using interrupt forwarding */
|
|
|
+ s390_pci_kvm_aif_disable(pbdev);
|
|
|
+ } else if (pbdev->summary_ind) {
|
|
|
pci_dereg_irqs(pbdev);
|
|
|
}
|
|
|
if (pbdev->iommu->enabled) {
|
|
@@ -1082,6 +1085,7 @@ static void s390_pcihost_plug(HotplugHandler *hotplug_dev, DeviceState *dev,
|
|
|
} else {
|
|
|
DPRINTF("zPCI interpretation facilities missing.\n");
|
|
|
pbdev->interp = false;
|
|
|
+ pbdev->forwarding_assist = false;
|
|
|
}
|
|
|
}
|
|
|
pbdev->iommu->dma_limit = s390_pci_start_dma_count(s, pbdev);
|
|
@@ -1090,11 +1094,13 @@ static void s390_pcihost_plug(HotplugHandler *hotplug_dev, DeviceState *dev,
|
|
|
if (!pbdev->interp) {
|
|
|
/* Do vfio passthrough but intercept for I/O */
|
|
|
pbdev->fh |= FH_SHM_VFIO;
|
|
|
+ pbdev->forwarding_assist = false;
|
|
|
}
|
|
|
} else {
|
|
|
pbdev->fh |= FH_SHM_EMUL;
|
|
|
/* Always intercept emulated devices */
|
|
|
pbdev->interp = false;
|
|
|
+ pbdev->forwarding_assist = false;
|
|
|
}
|
|
|
|
|
|
if (s390_pci_msix_init(pbdev) && !pbdev->interp) {
|
|
@@ -1244,7 +1250,10 @@ static void s390_pcihost_reset(DeviceState *dev)
|
|
|
/* Process all pending unplug requests */
|
|
|
QTAILQ_FOREACH_SAFE(pbdev, &s->zpci_devs, link, next) {
|
|
|
if (pbdev->unplug_requested) {
|
|
|
- if (pbdev->summary_ind) {
|
|
|
+ if (pbdev->interp && (pbdev->fh & FH_MASK_ENABLE)) {
|
|
|
+ /* Interpreted devices were using interrupt forwarding */
|
|
|
+ s390_pci_kvm_aif_disable(pbdev);
|
|
|
+ } else if (pbdev->summary_ind) {
|
|
|
pci_dereg_irqs(pbdev);
|
|
|
}
|
|
|
if (pbdev->iommu->enabled) {
|
|
@@ -1382,7 +1391,10 @@ static void s390_pci_device_reset(DeviceState *dev)
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
- if (pbdev->summary_ind) {
|
|
|
+ if (pbdev->interp && (pbdev->fh & FH_MASK_ENABLE)) {
|
|
|
+ /* Interpreted devices were using interrupt forwarding */
|
|
|
+ s390_pci_kvm_aif_disable(pbdev);
|
|
|
+ } else if (pbdev->summary_ind) {
|
|
|
pci_dereg_irqs(pbdev);
|
|
|
}
|
|
|
if (pbdev->iommu->enabled) {
|
|
@@ -1428,6 +1440,8 @@ static Property s390_pci_device_properties[] = {
|
|
|
DEFINE_PROP_S390_PCI_FID("fid", S390PCIBusDevice, fid),
|
|
|
DEFINE_PROP_STRING("target", S390PCIBusDevice, target),
|
|
|
DEFINE_PROP_BOOL("interpret", S390PCIBusDevice, interp, true),
|
|
|
+ DEFINE_PROP_BOOL("forwarding-assist", S390PCIBusDevice, forwarding_assist,
|
|
|
+ true),
|
|
|
DEFINE_PROP_END_OF_LIST(),
|
|
|
};
|
|
|
|