aboutsummaryrefslogtreecommitdiffstats
path: root/xen/arch/x86/msi.c
diff options
context:
space:
mode:
authorKeir Fraser <keir.fraser@citrix.com>2009-10-26 13:33:38 +0000
committerKeir Fraser <keir.fraser@citrix.com>2009-10-26 13:33:38 +0000
commitf821102450a157716034bb22b45d1f8720f091f6 (patch)
treee8e253d157caff96248fff173c985886bdb1b01f /xen/arch/x86/msi.c
parent9db20f3c2b99baacbfa7f95195cdb77c37ddd81e (diff)
downloadxen-f821102450a157716034bb22b45d1f8720f091f6.tar.gz
xen-f821102450a157716034bb22b45d1f8720f091f6.tar.bz2
xen-f821102450a157716034bb22b45d1f8720f091f6.zip
x86: IRQ Migration logic enhancement.
To programme MSI's addr/vector safely, delay irq migration operation before acking next interrupt. In this way, it should avoid inconsistent interrupts generation due to non-atomic writing addr and data registers about MSI. Port the logic from Linux and tailor it for Xen. Signed-off-by: Xiantao Zhang <xiantao.zhang@intel.com>
Diffstat (limited to 'xen/arch/x86/msi.c')
-rw-r--r--xen/arch/x86/msi.c4
1 files changed, 0 insertions, 4 deletions
diff --git a/xen/arch/x86/msi.c b/xen/arch/x86/msi.c
index 6bf4e6ef69..261da58185 100644
--- a/xen/arch/x86/msi.c
+++ b/xen/arch/x86/msi.c
@@ -231,7 +231,6 @@ static void write_msi_msg(struct msi_desc *entry, struct msi_msg *msg)
u8 slot = PCI_SLOT(dev->devfn);
u8 func = PCI_FUNC(dev->devfn);
- mask_msi_irq(entry->irq);
pci_conf_write32(bus, slot, func, msi_lower_address_reg(pos),
msg->address_lo);
if ( entry->msi_attrib.is_64 )
@@ -244,7 +243,6 @@ static void write_msi_msg(struct msi_desc *entry, struct msi_msg *msg)
else
pci_conf_write16(bus, slot, func, msi_data_reg(pos, 0),
msg->data);
- unmask_msi_irq(entry->irq);
break;
}
case PCI_CAP_ID_MSIX:
@@ -252,13 +250,11 @@ static void write_msi_msg(struct msi_desc *entry, struct msi_msg *msg)
void __iomem *base;
base = entry->mask_base;
- mask_msi_irq(entry->irq);
writel(msg->address_lo,
base + PCI_MSIX_ENTRY_LOWER_ADDR_OFFSET);
writel(msg->address_hi,
base + PCI_MSIX_ENTRY_UPPER_ADDR_OFFSET);
writel(msg->data, base + PCI_MSIX_ENTRY_DATA_OFFSET);
- unmask_msi_irq(entry->irq);
break;
}
default: