xen-devel.lists.xenproject.org archive mirror
 help / color / mirror / Atom feed
From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
To: xen-devel@lists.xensource.com
Cc: Stefano Stabellini <stefano.stabellini@eu.citrix.com>,
	Ian Campbell <ian.campbell@citrix.com>,
	Tim.Deegan@citrix.com
Subject: [PATCH v6 16/27] arm: irq
Date: Fri, 20 Jan 2012 16:36:04 +0000	[thread overview]
Message-ID: <1327077375-7623-16-git-send-email-stefano.stabellini@eu.citrix.com> (raw)
In-Reply-To: <alpine.DEB.2.00.1201201605370.3196@kaball-desktop>

A simple do_IRQ and request_irq implementation for ARM.

Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
Signed-off-by: Tim Deegan <Tim.Deegan@citrix.com>
---
 xen/arch/arm/irq.c          |  179 +++++++++++++++++++++++++++++++++++++++++++
 xen/include/asm-arm/irq.h   |   30 +++++++
 xen/include/asm-arm/setup.h |    2 +
 xen/include/xen/irq.h       |   13 +++
 4 files changed, 224 insertions(+), 0 deletions(-)
 create mode 100644 xen/arch/arm/irq.c
 create mode 100644 xen/include/asm-arm/irq.h

diff --git a/xen/arch/arm/irq.c b/xen/arch/arm/irq.c
new file mode 100644
index 0000000..17c939c
--- /dev/null
+++ b/xen/arch/arm/irq.c
@@ -0,0 +1,179 @@
+/*
+ * xen/arch/arm/irq.c
+ *
+ * ARM Interrupt support
+ *
+ * Ian Campbell <ian.campbell@citrix.com>
+ * Copyright (c) 2011 Citrix Systems.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+
+#include <xen/config.h>
+#include <xen/lib.h>
+#include <xen/spinlock.h>
+#include <xen/irq.h>
+#include <xen/init.h>
+#include <xen/errno.h>
+#include <xen/sched.h>
+
+#include "gic.h"
+
+static void enable_none(struct irq_desc *irq) { }
+static unsigned int startup_none(struct irq_desc *irq) { return 0; }
+static void disable_none(struct irq_desc *irq) { }
+static void ack_none(struct irq_desc *irq)
+{
+    printk("unexpected IRQ trap at irq %02x\n", irq->irq);
+}
+
+#define shutdown_none   disable_none
+#define end_none        enable_none
+
+hw_irq_controller no_irq_type = {
+    .typename = "none",
+    .startup = startup_none,
+    .shutdown = shutdown_none,
+    .enable = enable_none,
+    .disable = disable_none,
+    .ack = ack_none,
+    .end = end_none
+};
+
+int __init arch_init_one_irq_desc(struct irq_desc *desc)
+{
+    return 0;
+}
+
+
+static int __init init_irq_data(void)
+{
+    int irq;
+
+    for (irq = 0; irq < NR_IRQS; irq++) {
+        struct irq_desc *desc = irq_to_desc(irq);
+        init_one_irq_desc(desc);
+        desc->irq = irq;
+        desc->action  = NULL;
+    }
+    return 0;
+}
+
+void __init init_IRQ(void)
+{
+    BUG_ON(init_irq_data() < 0);
+}
+
+int __init 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;
+    action->free_on_release = 1;
+
+    retval = setup_irq(irq, action);
+    if (retval)
+        xfree(action);
+
+    return retval;
+}
+
+/* Dispatch an interrupt */
+void do_IRQ(struct cpu_user_regs *regs, unsigned int irq, int is_fiq)
+{
+    struct irq_desc *desc = irq_to_desc(irq);
+    struct irqaction *action = desc->action;
+
+    /* TODO: perfc_incr(irqs); */
+
+    /* TODO: this_cpu(irq_count)++; */
+
+    irq_enter();
+
+    spin_lock(&desc->lock);
+    desc->handler->ack(desc);
+
+    if ( action == NULL )
+    {
+        printk("Unknown %s %#3.3x\n",
+               is_fiq ? "FIQ" : "IRQ", irq);
+        goto out;
+    }
+
+    if ( desc->status & IRQ_GUEST )
+    {
+        struct domain *d = action->dev_id;
+
+        desc->handler->end(desc);
+
+        desc->status |= IRQ_INPROGRESS;
+
+        /* XXX: inject irq into the guest */
+        goto out_no_end;
+    }
+
+    desc->status |= IRQ_PENDING;
+
+    /*
+     * Since we set PENDING, if another processor is handling a different
+     * instance of this same irq, the other processor will take care of it.
+     */
+    if ( desc->status & (IRQ_DISABLED | IRQ_INPROGRESS) )
+        goto out;
+
+    desc->status |= IRQ_INPROGRESS;
+
+    action = desc->action;
+    while ( desc->status & IRQ_PENDING )
+    {
+        desc->status &= ~IRQ_PENDING;
+        spin_unlock_irq(&desc->lock);
+        action->handler(irq, action->dev_id, regs);
+        spin_lock_irq(&desc->lock);
+    }
+
+    desc->status &= ~IRQ_INPROGRESS;
+
+out:
+    desc->handler->end(desc);
+out_no_end:
+    spin_unlock(&desc->lock);
+    irq_exit();
+}
+
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/irq.h b/xen/include/asm-arm/irq.h
new file mode 100644
index 0000000..8e65a2e
--- /dev/null
+++ b/xen/include/asm-arm/irq.h
@@ -0,0 +1,30 @@
+#ifndef _ASM_HW_IRQ_H
+#define _ASM_HW_IRQ_H
+
+#include <xen/config.h>
+
+#define NR_VECTORS 256 /* XXX */
+
+typedef struct {
+    DECLARE_BITMAP(_bits,NR_VECTORS);
+} vmask_t;
+
+struct arch_pirq
+{
+};
+
+struct irq_cfg {
+#define arch_irq_desc irq_cfg
+};
+
+void do_IRQ(struct cpu_user_regs *regs, unsigned int irq, int is_fiq);
+
+#endif /* _ASM_HW_IRQ_H */
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/asm-arm/setup.h b/xen/include/asm-arm/setup.h
index 1dc3f97..2041f06 100644
--- a/xen/include/asm-arm/setup.h
+++ b/xen/include/asm-arm/setup.h
@@ -7,6 +7,8 @@ void arch_get_xen_caps(xen_capabilities_info_t *info);
 
 int construct_dom0(struct domain *d);
 
+void init_IRQ(void);
+
 #endif
 /*
  * Local variables:
diff --git a/xen/include/xen/irq.h b/xen/include/xen/irq.h
index 7afc64a..61a1559 100644
--- a/xen/include/xen/irq.h
+++ b/xen/include/xen/irq.h
@@ -106,6 +106,19 @@ extern irq_desc_t irq_desc[NR_VECTORS];
 
 #define request_irq(irq, handler, irqflags, devname, devid) \
     request_irq_vector(irq_to_vector(irq), handler, irqflags, devname, devid)
+
+#elif defined(__arm__)
+
+#define NR_IRQS		1024
+#define nr_irqs NR_IRQS
+extern irq_desc_t irq_desc[NR_IRQS];
+
+extern int setup_irq(unsigned int irq, struct irqaction *);
+extern void release_irq(unsigned int irq);
+extern int request_irq(unsigned int irq,
+               void (*handler)(int, void *, struct cpu_user_regs *),
+               unsigned long irqflags, const char * devname, void *dev_id);
+
 #else
 extern int setup_irq(unsigned int irq, struct irqaction *);
 extern void release_irq(unsigned int irq);
-- 
1.7.2.5

  parent reply	other threads:[~2012-01-20 16:36 UTC|newest]

Thread overview: 41+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-01-20 16:35 [PATCH v6 00/27] xen: ARMv7 with virtualization extensions Stefano Stabellini
2012-01-20 16:35 ` [PATCH v6 01/27] Move cpufreq option parsing to cpufreq.c Stefano Stabellini
2012-01-20 16:35 ` [PATCH v6 02/27] Include some header files that are not automatically included on all archs Stefano Stabellini
2012-01-20 16:35 ` [PATCH v6 03/27] A collection of fixes to Xen common files Stefano Stabellini
2012-01-20 16:35 ` [PATCH v6 04/27] xen: implement an signed 64 bit division helper function Stefano Stabellini
2012-01-20 16:35 ` [PATCH v6 05/27] Introduce clear_user and clear_guest Stefano Stabellini
2012-01-20 16:35 ` [PATCH v6 06/27] libelf-loader: introduce elf_load_image Stefano Stabellini
2012-01-20 16:35 ` [PATCH v6 07/27] xen/common/Makefile: introduce HAS_CPUFREQ, HAS_PCI, HAS_PASSTHROUGH, HAS_NS16550, HAS_KEXEC Stefano Stabellini
2012-01-27 15:15   ` Ian Campbell
2012-02-08  8:35   ` Keir Fraser
2012-01-20 16:35 ` [PATCH v6 08/27] arm: compile tmem Stefano Stabellini
2012-01-20 16:35 ` [PATCH v6 09/27] arm: header files Stefano Stabellini
2012-01-20 16:35 ` [PATCH v6 10/27] arm: bit manipulation, copy and division libraries Stefano Stabellini
2012-01-20 16:35 ` [PATCH v6 11/27] arm: entry.S and head.S Stefano Stabellini
2012-01-20 16:36 ` [PATCH v6 12/27] arm: domain Stefano Stabellini
2012-01-20 16:36 ` [PATCH v6 13/27] arm: domain_build Stefano Stabellini
2012-01-20 16:36 ` [PATCH v6 14/27] arm: driver for CoreLink GIC-400 Generic Interrupt Controller Stefano Stabellini
2012-01-20 16:36 ` [PATCH v6 15/27] arm: mmio handlers Stefano Stabellini
2012-01-20 16:36 ` Stefano Stabellini [this message]
2012-01-20 16:36 ` [PATCH v6 17/27] arm: mm and p2m Stefano Stabellini
2012-01-20 16:36 ` [PATCH v6 19/27] arm: early setup code Stefano Stabellini
2012-01-20 16:36 ` [PATCH v6 20/27] arm: shutdown, smp and smpboot Stefano Stabellini
2012-01-20 16:36 ` [PATCH v6 21/27] arm: driver for the generic timer for ARMv7 Stefano Stabellini
2012-01-20 16:36 ` [PATCH v6 22/27] arm: trap handlers Stefano Stabellini
2012-01-20 16:36 ` [PATCH v6 23/27] arm: vgic emulation Stefano Stabellini
2012-01-20 16:36 ` [PATCH v6 24/27] arm: vtimer Stefano Stabellini
2012-01-20 16:36 ` [PATCH v6 25/27] arm: makefiles Stefano Stabellini
2012-02-02 16:46   ` Stefano Stabellini
2012-01-20 16:36 ` [PATCH v6 26/27] ARM: support zImage format kernels for dom0 Stefano Stabellini
2012-01-20 16:36 ` [PATCH v6 27/27] ARM: copy DTB appended to zImage Stefano Stabellini
2012-02-09 11:49 ` [PATCH v6 00/27] xen: ARMv7 with virtualization extensions Ian Campbell
2012-02-09 14:45   ` Ian Campbell
2012-02-09 14:53     ` [PATCH] arm: define domain_pirq_to_irq Ian Campbell
2012-02-09 15:18       ` Stefano Stabellini
2012-02-09 15:21         ` Ian Campbell
2012-02-09 15:28           ` Stefano Stabellini
2012-02-09 15:52             ` Ian Campbell
2012-02-09 14:53     ` [PATCH] arm: define stub arch_dump_shared_mem_info Ian Campbell
2012-02-09 15:19       ` Stefano Stabellini
2012-02-09 15:22         ` Ian Campbell
2012-02-09 15:28           ` Stefano Stabellini

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1327077375-7623-16-git-send-email-stefano.stabellini@eu.citrix.com \
    --to=stefano.stabellini@eu.citrix.com \
    --cc=Tim.Deegan@citrix.com \
    --cc=ian.campbell@citrix.com \
    --cc=xen-devel@lists.xensource.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).