diff options
author | Keir Fraser <keir.fraser@citrix.com> | 2009-10-26 13:33:38 +0000 |
---|---|---|
committer | Keir Fraser <keir.fraser@citrix.com> | 2009-10-26 13:33:38 +0000 |
commit | f821102450a157716034bb22b45d1f8720f091f6 (patch) | |
tree | e8e253d157caff96248fff173c985886bdb1b01f /xen/arch/x86/msi.c | |
parent | 9db20f3c2b99baacbfa7f95195cdb77c37ddd81e (diff) | |
download | xen-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.c | 4 |
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: |