WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

[Xen-devel] [PATCH 37 of 38] xen: bind pirq to vector and event channel

To: Ingo Molnar <mingo@xxxxxxx>
Subject: [Xen-devel] [PATCH 37 of 38] xen: bind pirq to vector and event channel
From: Jeremy Fitzhardinge <jeremy@xxxxxxxx>
Date: Thu, 13 Nov 2008 11:10:35 -0800
Cc: the arch/x86 maintainers <x86@xxxxxxxxxx>, Xen-devel <xen-devel@xxxxxxxxxxxxxxxxxxx>, linux-kernel@xxxxxxxxxxxxxxx, Ian Campbell <ian.campbell@xxxxxxxxxx>
Delivery-date: Thu, 13 Nov 2008 11:54:29 -0800
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
In-reply-to: <patchbomb.1226603398@xxxxxxxxxxxxxxxxx>
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
Having converting a dev+pin to a gsi, and that gsi to an irq, and
allocated a vector for the irq, we must program the IO APIC to deliver
an interrupt on a pin to the vector, so Xen can deliver it as an event
channel.

Given the pirq, we can get the gsi and vector.  We map the gsi to a
specific IO APIC's pin, and set the routing entry.

Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@xxxxxxxxxx>
---
 arch/x86/xen/apic.c |    4 ++--
 arch/x86/xen/pci.c  |   34 +++++++++++++++++++++++++++++++---
 2 files changed, 33 insertions(+), 5 deletions(-)

diff --git a/arch/x86/xen/apic.c b/arch/x86/xen/apic.c
--- a/arch/x86/xen/apic.c
+++ b/arch/x86/xen/apic.c
@@ -4,6 +4,7 @@
 
 #include <asm/io_apic.h>
 #include <asm/acpi.h>
+#include <asm/hw_irq.h>
 
 #include <asm/xen/hypervisor.h>
 #include <asm/xen/hypercall.h>
@@ -13,8 +14,7 @@
 
 static void __init xen_io_apic_init(void)
 {
-       printk("xen apic init\n");
-       dump_stack();
+       enable_IO_APIC();
 }
 
 static unsigned int xen_io_apic_read(unsigned apic, unsigned reg)
diff --git a/arch/x86/xen/pci.c b/arch/x86/xen/pci.c
--- a/arch/x86/xen/pci.c
+++ b/arch/x86/xen/pci.c
@@ -2,8 +2,10 @@
 #include <linux/acpi.h>
 #include <linux/pci.h>
 
+#include <asm/mpspec.h>
+#include <asm/io_apic.h>
+
 #include <asm/xen/hypervisor.h>
-
 #include <xen/interface/xen.h>
 #include <xen/events.h>
 
@@ -11,6 +13,31 @@
 
 #include "xen-ops.h"
 
+static void xen_set_io_apic_routing(int irq, int trigger, int polarity)
+{
+       int ioapic, ioapic_pin;
+       int vector, gsi;
+       struct IO_APIC_route_entry entry;
+
+       gsi = xen_gsi_from_irq(irq);
+       vector = xen_vector_from_irq(irq);
+
+       ioapic = mp_find_ioapic(gsi);
+       if (ioapic == -1) {
+               printk(KERN_WARNING "xen_set_ioapic_routing: irq %d gsi %d 
ioapic %d\n",
+                       irq, gsi, ioapic);
+               return;
+       }
+
+       ioapic_pin = mp_find_ioapic_pin(ioapic, gsi);
+
+       printk(KERN_INFO "xen_set_ioapic_routing: irq %d gsi %d vector %d 
ioapic %d pin %d triggering %d polarity %d\n",
+               irq, gsi, vector, ioapic, ioapic_pin, trigger, polarity);
+
+       setup_ioapic_entry(ioapic, -1, &entry, ~0, trigger, polarity, vector);
+       ioapic_write_entry(ioapic, ioapic_pin, entry);
+}
+
 int xen_register_gsi(u32 gsi, int triggering, int polarity)
 {
        int irq;
@@ -25,6 +52,9 @@
 
        printk(KERN_DEBUG "xen: --> irq=%d\n", irq);
 
+       if (irq > 0)
+               xen_set_io_apic_routing(irq, triggering, polarity);
+
        return irq;
 }
 
@@ -45,8 +75,6 @@
 
                printk(KERN_INFO "xen: PCI device %s pin %d -> irq %d\n",
                       pci_name(dev), dev->pin, irq);
-
-               /* install vector in ioapic? */
        } else
                printk(KERN_INFO "xen: irq enable for %s failed: rc=%d pin=%d 
irq=%d\n",
                        pci_name(dev), rc, dev->pin, dev->irq);



_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel

<Prev in Thread] Current Thread [Next in Thread>