# HG changeset patch
# User kfraser@xxxxxxxxxxxxxxxxxxxxx
# Date 1190190260 -3600
# Node ID 45548c83daef3c0fce6b9d4dedc39f9422bcc4a0
# Parent aad813d8a8ad6f9d7d4f0d04a14fe088dd671e96
PCI passthru various Xen changes.
Signed-off-by: Allen Kay <allen.m.kay@xxxxxxxxx>
Signed-off-by: Guy Zana <guy@xxxxxxxxxxxx>
---
xen/arch/x86/acpi/boot.c | 6 +++--
xen/arch/x86/hvm/hvm.c | 15 ++++++++-----
xen/arch/x86/hvm/vmx/vtd/intel-iommu.c | 8 ------
xen/arch/x86/irq.c | 38 ++++++++++++++++++++++++++++++++-
xen/arch/x86/setup.c | 2 +
xen/include/xen/irq.h | 3 ++
6 files changed, 57 insertions(+), 15 deletions(-)
diff -r aad813d8a8ad -r 45548c83daef xen/arch/x86/acpi/boot.c
--- a/xen/arch/x86/acpi/boot.c Wed Sep 19 09:12:06 2007 +0100
+++ b/xen/arch/x86/acpi/boot.c Wed Sep 19 09:24:20 2007 +0100
@@ -1017,5 +1017,7 @@ int __init acpi_boot_init(void)
acpi_table_parse(ACPI_HPET, acpi_parse_hpet);
- return 0;
-}
+ acpi_dmar_init();
+
+ return 0;
+}
diff -r aad813d8a8ad -r 45548c83daef xen/arch/x86/hvm/hvm.c
--- a/xen/arch/x86/hvm/hvm.c Wed Sep 19 09:12:06 2007 +0100
+++ b/xen/arch/x86/hvm/hvm.c Wed Sep 19 09:24:20 2007 +0100
@@ -216,21 +216,25 @@ int hvm_domain_initialise(struct domain
spin_lock_init(&d->arch.hvm_domain.pbuf_lock);
spin_lock_init(&d->arch.hvm_domain.irq_lock);
+ rc = paging_enable(d, PG_refcounts|PG_translate|PG_external);
+ if ( rc != 0 )
+ return rc;
+
rc = iommu_domain_init(d);
if ( rc != 0 )
return rc;
- rc = paging_enable(d, PG_refcounts|PG_translate|PG_external);
- if ( rc != 0 )
- return rc;
-
vpic_init(d);
vioapic_init(d);
hvm_init_ioreq_page(d, &d->arch.hvm_domain.ioreq);
hvm_init_ioreq_page(d, &d->arch.hvm_domain.buf_ioreq);
- return hvm_funcs.domain_initialise(d);
+ rc = hvm_funcs.domain_initialise(d);
+ if ( rc != 0 )
+ release_devices(d);
+
+ return rc;
}
void hvm_domain_relinquish_resources(struct domain *d)
@@ -246,6 +250,7 @@ void hvm_domain_relinquish_resources(str
void hvm_domain_destroy(struct domain *d)
{
+ release_devices(d);
hvm_funcs.domain_destroy(d);
}
diff -r aad813d8a8ad -r 45548c83daef xen/arch/x86/hvm/vmx/vtd/intel-iommu.c
--- a/xen/arch/x86/hvm/vmx/vtd/intel-iommu.c Wed Sep 19 09:12:06 2007 +0100
+++ b/xen/arch/x86/hvm/vmx/vtd/intel-iommu.c Wed Sep 19 09:24:20 2007 +0100
@@ -35,12 +35,6 @@
#include "msi.h"
#define VTDPREFIX
-static inline int request_irq(int vector, void *func,
- int flags, char *name, void *data)
-{
- return -ENOSYS;
-}
-
extern void print_iommu_regs(struct acpi_drhd_unit *drhd);
extern void print_vtd_entries(struct domain *d, int bus, int devfn,
unsigned long gmfn);
@@ -1676,7 +1670,7 @@ int iommu_setup(void)
struct acpi_drhd_unit *drhd;
struct iommu *iommu;
- if (list_empty(&acpi_drhd_units))
+ if (!vtd_enabled)
return 0;
INIT_LIST_HEAD(&hd->pdev_list);
diff -r aad813d8a8ad -r 45548c83daef xen/arch/x86/irq.c
--- a/xen/arch/x86/irq.c Wed Sep 19 09:12:06 2007 +0100
+++ b/xen/arch/x86/irq.c Wed Sep 19 09:24:20 2007 +0100
@@ -16,6 +16,7 @@
#include <xen/compat.h>
#include <asm/current.h>
#include <asm/smpboot.h>
+#include <asm/iommu.h>
/* opt_noirqbalance: If true, software IRQ balancing/affinity is disabled. */
int opt_noirqbalance = 0;
@@ -96,6 +97,39 @@ asmlinkage void do_IRQ(struct cpu_user_r
out:
desc->handler->end(vector);
spin_unlock(&desc->lock);
+}
+
+int request_irq(unsigned int irq,
+ void (*handler)(int, void *, struct cpu_user_regs *),
+ unsigned long irqflags, const char * devname, void *dev_id)
+{
+ struct irqaction * action;
+ int retval;
+
+ /*
+ * Sanity-check: shared interrupts must pass in a real dev-ID,
+ * otherwise we'll have trouble later trying to figure out
+ * which interrupt is which (messes up the interrupt freeing
+ * logic etc).
+ */
+ if (irq >= NR_IRQS)
+ return -EINVAL;
+ if (!handler)
+ return -EINVAL;
+
+ action = xmalloc(struct irqaction);
+ if (!action)
+ return -ENOMEM;
+
+ action->handler = handler;
+ action->name = devname;
+ action->dev_id = dev_id;
+
+ retval = setup_irq(irq, action);
+ if (retval)
+ xfree(action);
+
+ return retval;
}
void free_irq(unsigned int irq)
@@ -203,7 +237,9 @@ static void __do_IRQ_guest(int vector)
if ( (action->ack_type != ACKTYPE_NONE) &&
!test_and_set_bit(irq, d->pirq_mask) )
action->in_flight++;
- send_guest_pirq(d, irq);
+ if (!hvm_do_IRQ_dpci(d, irq))
+ send_guest_pirq(d, irq);
+
}
}
diff -r aad813d8a8ad -r 45548c83daef xen/arch/x86/setup.c
--- a/xen/arch/x86/setup.c Wed Sep 19 09:12:06 2007 +0100
+++ b/xen/arch/x86/setup.c Wed Sep 19 09:24:20 2007 +0100
@@ -1038,6 +1038,8 @@ void __init __start_xen(unsigned long mb
_initrd_len = mod[initrdidx].mod_end - mod[initrdidx].mod_start;
}
+ iommu_setup();
+
/*
* We're going to setup domain0 using the module(s) that we stashed safely
* above our heap. The second module, if present, is an initrd ramdisk.
diff -r aad813d8a8ad -r 45548c83daef xen/include/xen/irq.h
--- a/xen/include/xen/irq.h Wed Sep 19 09:12:06 2007 +0100
+++ b/xen/include/xen/irq.h Wed Sep 19 09:24:20 2007 +0100
@@ -64,6 +64,9 @@ extern irq_desc_t irq_desc[NR_IRQS];
extern int setup_irq(unsigned int, struct irqaction *);
extern void free_irq(unsigned int);
+extern int request_irq(unsigned int irq,
+ void (*handler)(int, void *, struct cpu_user_regs *),
+ unsigned long irqflags, const char * devname, void *dev_id);
extern hw_irq_controller no_irq_type;
extern void no_action(int cpl, void *dev_id, struct cpu_user_regs *regs);
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|