# HG changeset patch
# User Hollis Blanchard <hollisb@xxxxxxxxxx>
# Date 1183757110 18000
# Node ID 50fab2124ef0e745953b19692cd3cfcd30627037
# Parent abc2bd44e1dc689af0a1acc2e852c7d45e1d076f
[POWERPC][XEN] Stop sharing the MPIC between dom0 and Xen.
Xen is now the sole owner of the MPIC. Requires Xen Linux 2.6.18.
Signed-off-by: Hollis Blanchard <hollisb@xxxxxxxxxx>
---
xen/arch/powerpc/external.c | 85 +------------------------------------------
xen/arch/powerpc/mpic_init.c | 58 +++++------------------------
xen/arch/powerpc/mpic_init.h | 4 --
3 files changed, 14 insertions(+), 133 deletions(-)
diff -r abc2bd44e1dc -r 50fab2124ef0 xen/arch/powerpc/external.c
--- a/xen/arch/powerpc/external.c Fri Jul 06 16:21:39 2007 -0500
+++ b/xen/arch/powerpc/external.c Fri Jul 06 16:25:10 2007 -0500
@@ -43,8 +43,6 @@ unsigned long io_apic_irqs;
unsigned long io_apic_irqs;
int ioapic_ack_new = 1;
-static struct hw_interrupt_type *hc_irq;
-
/* deliver_ee: called with interrupts off when resuming every vcpu */
void deliver_ee(struct cpu_user_regs *regs)
{
@@ -81,6 +79,7 @@ void do_external(struct cpu_user_regs *r
BUG_ON(mfmsr() & MSR_EE);
vec = xen_mpic_get_irq(regs);
+ DBG(">HV: vec=%d, pc=0x%lx, msr=0x%lx\n", vec, regs->pc, regs->msr);
if (irq_desc[vec].status & IRQ_PER_CPU) {
/* x86 do_IRQ does not respect the per cpu flag. */
@@ -90,7 +89,6 @@ void do_external(struct cpu_user_regs *r
desc->action->handler(vector_to_irq(vec), desc->action->dev_id, regs);
desc->handler->end(vec);
} else if (vec != -1) {
- DBG("EE:0x%lx isrc: %d\n", regs->msr, vec);
regs->entry_vector = vec;
do_IRQ(regs);
@@ -106,87 +104,9 @@ void do_external(struct cpu_user_regs *r
}
}
-static int xen_local_irq(unsigned int irq)
-{
- irq_desc_t *desc;
- unsigned int vector;
-
- vector = irq_to_vector(irq);
- desc = &irq_desc[vector];
-
- return !(desc->status & IRQ_GUEST);
-}
-
-static unsigned int xen_startup_irq(unsigned int irq)
-{
- DBG("%s(%d)\n", __func__, irq);
- if (xen_local_irq(irq)) {
- return hc_irq->startup(irq);
- }
- return 0;
-}
-
-static void xen_shutdown_irq(unsigned int irq)
-{
- DBG("%s(%d)\n", __func__, irq);
- if (xen_local_irq(irq)) {
- hc_irq->shutdown(irq);
- }
-}
-
-static void xen_enable_irq(unsigned int irq)
-{
- DBG("%s(%d)\n", __func__, irq);
- if (xen_local_irq(irq)) {
- hc_irq->enable(irq);
- }
-}
-
-static void xen_disable_irq(unsigned int irq)
-{
- DBG("%s(%d)\n", __func__, irq);
- if (xen_local_irq(irq)) {
- hc_irq->disable(irq);
- }
-}
-
-static void xen_ack_irq(unsigned int irq)
-{
- DBG("%s(%d)\n", __func__, irq);
- if (xen_local_irq(irq)) {
- if (hc_irq->ack) hc_irq->ack(irq);
- }
-}
-
-static void xen_end_irq(unsigned int irq)
-{
- DBG("%s(%d)\n", __func__, irq);
- if (xen_local_irq(irq)) {
- hc_irq->end(irq);
- }
-}
-
-static void xen_set_affinity(unsigned int irq, cpumask_t mask)
-{
- DBG("%s(%d)\n", __func__, irq);
- if (xen_local_irq(irq)) {
- if (hc_irq->set_affinity) hc_irq->set_affinity(irq, mask);
- }
-}
-
-static struct hw_interrupt_type xen_irq = {
- .startup = xen_startup_irq,
- .enable = xen_enable_irq,
- .disable = xen_disable_irq,
- .shutdown = xen_shutdown_irq,
- .ack = xen_ack_irq,
- .end = xen_end_irq,
- .set_affinity = xen_set_affinity,
-};
-
void init_IRQ(void)
{
- hc_irq = xen_mpic_init(&xen_irq);
+ xen_mpic_init();
}
void ack_APIC_irq(void)
@@ -251,7 +171,6 @@ int ioapic_guest_read(unsigned long phys
int ioapic_guest_read(unsigned long physbase, unsigned int reg, u32 *pval)
{
BUG_ON(pval != pval);
-
return 0;
}
diff -r abc2bd44e1dc -r 50fab2124ef0 xen/arch/powerpc/mpic_init.c
--- a/xen/arch/powerpc/mpic_init.c Fri Jul 06 16:21:39 2007 -0500
+++ b/xen/arch/powerpc/mpic_init.c Fri Jul 06 16:25:10 2007 -0500
@@ -322,43 +322,6 @@ static int find_mpic(void)
return rc;
}
-#ifdef CONFIG_SHARE_MPIC
-static struct hw_interrupt_type hc_irq;
-
-static struct hw_interrupt_type *share_mpic(
- struct hw_interrupt_type *mpic_irq,
- struct hw_interrupt_type *xen_irq)
-{
- hc_irq.startup = mpic_irq->startup;
- mpic_irq->startup = xen_irq->startup;
-
- hc_irq.enable = mpic_irq->enable;
- mpic_irq->enable = xen_irq->enable;
-
- hc_irq.disable = mpic_irq->disable;
- mpic_irq->disable = xen_irq->disable;
-
- hc_irq.shutdown = mpic_irq->shutdown;
- mpic_irq->shutdown = xen_irq->shutdown;
-
- hc_irq.ack = mpic_irq->ack;
- mpic_irq->ack = xen_irq->ack;
-
- hc_irq.end = mpic_irq->end;
- mpic_irq->end = xen_irq->end;
-
- hc_irq.set_affinity = mpic_irq->set_affinity;
- mpic_irq->set_affinity = xen_irq->set_affinity;
-
- return &hc_irq;
-}
-
-#else /* CONFIG_SHARE_MPIC */
-
-#define share_mpic(M,X) (M)
-
-#endif
-
static unsigned int mpic_startup_ipi(unsigned int irq)
{
mpic->hc_ipi.enable(irq);
@@ -395,7 +358,11 @@ int request_irq(unsigned int irq,
return retval;
}
-struct hw_interrupt_type *xen_mpic_init(struct hw_interrupt_type *xen_irq)
+static void dummy_ack(unsigned int irq)
+{
+}
+
+void xen_mpic_init(void)
{
unsigned int isu_size;
unsigned int irq_offset;
@@ -403,7 +370,6 @@ struct hw_interrupt_type *xen_mpic_init(
unsigned int ipi_offset;
unsigned char *senses;
unsigned int senses_count;
- struct hw_interrupt_type *hit;
printk("%s: start\n", __func__);
@@ -420,7 +386,7 @@ struct hw_interrupt_type *xen_mpic_init(
if (find_mpic()) {
printk("%s: ERROR: Could not find open pic.\n", __func__);
- return NULL;
+ return;
}
mpic = mpic_alloc(opic_addr,
@@ -431,17 +397,15 @@ struct hw_interrupt_type *xen_mpic_init(
BUG_ON(mpic == NULL);
mpic_init(mpic);
- hit = share_mpic(&mpic->hc_irq, xen_irq);
-
printk("%s: success\n", __func__);
- mpic->hc_ipi.ack = xen_irq->ack;
+ mpic->hc_irq.ack = dummy_ack;
+ mpic->hc_ipi.ack = dummy_ack;
mpic->hc_ipi.startup = mpic_startup_ipi;
mpic_request_ipis();
-
- return hit;
-}
-
+}
+
+/* Note: reading the vector implicitly ACKs it in hardware. */
int xen_mpic_get_irq(struct cpu_user_regs *regs)
{
BUG_ON(mpic == NULL);
diff -r abc2bd44e1dc -r 50fab2124ef0 xen/arch/powerpc/mpic_init.h
--- a/xen/arch/powerpc/mpic_init.h Fri Jul 06 16:21:39 2007 -0500
+++ b/xen/arch/powerpc/mpic_init.h Fri Jul 06 16:25:10 2007 -0500
@@ -21,9 +21,7 @@
#ifndef _MPIC_INIT_H
#define _MPIC_INIT_H
-extern struct hw_interrupt_type *xen_mpic_init(
- struct hw_interrupt_type *xen_irq);
-
+extern void xen_mpic_init(void);
extern int xen_mpic_get_irq(struct cpu_user_regs *regs);
#endif /* #ifndef _MPIC_INIT_H */
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|