summaryrefslogtreecommitdiff
path: root/c/src/lib/libbsp/powerpc/mvme3100/irq/irq_init.c
diff options
context:
space:
mode:
Diffstat (limited to 'c/src/lib/libbsp/powerpc/mvme3100/irq/irq_init.c')
-rw-r--r--c/src/lib/libbsp/powerpc/mvme3100/irq/irq_init.c140
1 files changed, 140 insertions, 0 deletions
diff --git a/c/src/lib/libbsp/powerpc/mvme3100/irq/irq_init.c b/c/src/lib/libbsp/powerpc/mvme3100/irq/irq_init.c
new file mode 100644
index 0000000000..9b474899b7
--- /dev/null
+++ b/c/src/lib/libbsp/powerpc/mvme3100/irq/irq_init.c
@@ -0,0 +1,140 @@
+/* irq_init.c
+ *
+ * This file contains the implementation of rtems initialization
+ * related to interrupt handling.
+ *
+ * CopyRight (C) 1999 valette@crf.canon.fr
+ *
+ * Enhanced by Jay Kulpinski <jskulpin@eng01.gdds.com>
+ * to make it valid for MVME2300 Motorola boards.
+ *
+ * Till Straumann <strauman@slac.stanford.edu>, 12/20/2001:
+ * Use the new interface to openpic_init
+ *
+ * Adapted for the mvme3100 BSP by T. Straumann, 2007.
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.com/license/LICENSE.
+ *
+ * $Id$
+ */
+
+#include <libcpu/io.h>
+#include <bsp/pci.h>
+#include <bsp/openpic.h>
+#include <bsp/irq.h>
+#include <bsp.h>
+#include <libcpu/raw_exception.h>
+#include <rtems/bspIo.h>
+
+static void nop_func()
+{
+ printk("Unhandled IRQ\n");
+}
+
+static rtems_irq_connect_data rtemsIrq[BSP_IRQ_NUMBER];
+static rtems_irq_global_settings initial_config;
+static rtems_irq_connect_data defaultIrq = {
+ /* vectorIdex, hdl , handle , on , off , isOn */
+ 0, nop_func , NULL , 0 , 0 , 0
+};
+
+static rtems_irq_prio irqPrioTable[BSP_IRQ_NUMBER]={
+ /*
+ * actual priorities for interrupt :
+ * 0 means that only current interrupt is masked
+ * 255 means all other interrupts are masked
+ */
+ /*
+ * PCI Interrupts
+ */
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, /* for raven prio 0 means unactive... */
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, /* for raven prio 0 means unactive... */
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, /* for raven prio 0 means unactive... */
+ /*
+ * Processor exceptions handled as interrupts
+ */
+ 0
+};
+
+ /*
+ * This code assumes the exceptions management setup has already
+ * been done. We just need to replace the exceptions that will
+ * be handled like interrupt. On mcp750/mpc750 and many PPC processors
+ * this means the decrementer exception and the external exception.
+ */
+void BSP_rtems_irq_mng_init(unsigned cpuId)
+{
+ /* We should really have a way to find the number of sources
+ * the driver will use so that the size of the polarity-array
+ * matches the driver's idea of it.
+ */
+ unsigned char pol[56];
+ int i;
+
+ /* Note: The openpic driver initializes only as many
+ * 'pic-external' interrupt sources as reported
+ * by the feature register.
+ * The 8540's openpic supports 12 core-external
+ * and 23 core-internal (both of these groups
+ * are external to the PIC, i.e., 'pic-external')
+ * interrupts but between the corresponding
+ * banks of vector/priority registers there is
+ * a gap leaving space for 4 (unsupported) irqs.
+ * The driver, not knowing of this gap, would
+ * initialize the 12 core-external sources
+ * followed by 4 unsupported sources and 19
+ * core-internal sources thus leaving the last
+ * four core-internal sources uninitialized.
+ * Luckily, the feature register reports
+ * too many sources:
+ * - the 4 IPI plus 4 timer plus 4 messaging
+ * sources are included with the count
+ * - there are unused core-internal sources 24..32
+ * which are also supported by the pic
+ * bringing the reported number of sources to
+ * a count of 56 (12+32+4+4+4) which is enough
+ * so that all pic-external sources are covered
+ * and initialized.
+ *
+ * NOTE: All core-internal sources are active-high.
+ * The manual says that setting the polarity
+ * to 'low/0' will disable the interrupt but
+ * I found this not to be true: on the device
+ * I tested the interrupt was asserted hard.
+ */
+
+ /* core-external sources on the mvme3100 are active-low,
+ * core-internal sources are active high.
+ */
+ for (i=0; i<BSP_EXT_IRQ_NUMBER; i++)
+ pol[i]=0;
+ for (i=BSP_EXT_IRQ_NUMBER; i< BSP_EXT_IRQ_NUMBER + BSP_CORE_IRQ_NUMBER; i++)
+ pol[i]=1;
+
+ openpic_init(1, pol, 0, 0, 0, 0);
+
+ /*
+ * re-init the rtemsIrq table
+ */
+ for (i = 0; i < BSP_IRQ_NUMBER; i++) {
+ rtemsIrq[i] = defaultIrq;
+ rtemsIrq[i].name = i;
+ }
+ /*
+ * Init initial Interrupt management config
+ */
+ initial_config.irqNb = BSP_IRQ_NUMBER;
+ initial_config.defaultEntry = defaultIrq;
+ initial_config.irqHdlTbl = rtemsIrq;
+ initial_config.irqBase = BSP_LOWEST_OFFSET;
+ initial_config.irqPrioTbl = irqPrioTable;
+
+ if (!BSP_rtems_irq_mngt_set(&initial_config)) {
+ /*
+ * put something here that will show the failure...
+ */
+ BSP_panic("Unable to initialize RTEMS interrupt Management!!! System locked\n");
+ }
+}