#include <asm/hvm/domain.h>
#include <asm/hvm/support.h>
-void __hvm_pci_intx_assert(
+static void __hvm_pci_intx_assert(
struct domain *d, unsigned int device, unsigned int intx)
{
struct hvm_irq *hvm_irq = &d->arch.hvm_domain.irq;
spin_unlock(&d->arch.hvm_domain.irq_lock);
}
-void __hvm_pci_intx_deassert(
+static void __hvm_pci_intx_deassert(
struct domain *d, unsigned int device, unsigned int intx)
{
struct hvm_irq *hvm_irq = &d->arch.hvm_domain.irq;
ent->fields.remote_irr = 0;
if ( vtd_enabled )
+ {
+ spin_unlock(&d->arch.hvm_domain.irq_lock);
hvm_dpci_eoi(current->domain, gsi, ent);
+ spin_lock(&d->arch.hvm_domain.irq_lock);
+ }
if ( (ent->fields.trig_mode == VIOAPIC_LEVEL_TRIG) &&
!ent->fields.mask &&
struct hvm_irq_dpci *hvm_irq_dpci = d->arch.hvm_domain.irq.dpci;
uint32_t device, intx, machine_gsi;
- ASSERT(spin_is_locked(&d->arch.hvm_domain.irq_lock));
-
if ( !vtd_enabled || (hvm_irq_dpci == NULL) ||
!hvm_irq_dpci->girq[guest_gsi].valid )
return;
intx = hvm_irq_dpci->girq[guest_gsi].intx;
gdprintk(XENLOG_INFO, "hvm_dpci_eoi:: device %x intx %x\n",
device, intx);
- __hvm_pci_intx_deassert(d, device, intx);
+ hvm_pci_intx_deassert(d, device, intx);
if ( (ent == NULL) || !ent->fields.mask )
pirq_guest_eoi(d, machine_gsi);
}
vpic->isr &= ~(1 << irq);
if ( cmd == 7 )
vpic->priority_add = (irq + 1) & 7;
- if ( vtd_enabled )
- {
- irq |= ((addr & 0xa0) == 0xa0) ? 8 : 0;
- hvm_dpci_eoi(current->domain,
- hvm_isa_irq_to_gsi(irq), NULL);
- }
- break;
+ /* Release lock and EOI the physical interrupt (if any). */
+ vpic_update_int_output(vpic);
+ vpic_unlock(vpic);
+ hvm_dpci_eoi(current->domain,
+ hvm_isa_irq_to_gsi((addr >> 7) ? (irq|8) : irq),
+ NULL);
+ return; /* bail immediately */
case 6: /* Set Priority */
vpic->priority_add = (val + 1) & 7;
break;
#define hvm_isa_irq_to_gsi(isa_irq) ((isa_irq) ? : 2)
/* Modify state of a PCI INTx wire. */
-void __hvm_pci_intx_assert(
- struct domain *d, unsigned int device, unsigned int intx);
void hvm_pci_intx_assert(
struct domain *d, unsigned int device, unsigned int intx);
-void __hvm_pci_intx_deassert(
- struct domain *d, unsigned int device, unsigned int intx);
void hvm_pci_intx_deassert(
struct domain *d, unsigned int device, unsigned int intx);