summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/powerpc/shared/openpic
diff options
context:
space:
mode:
authorTill Straumann <strauman@slac.stanford.edu>2005-12-02 20:45:57 +0000
committerTill Straumann <strauman@slac.stanford.edu>2005-12-02 20:45:57 +0000
commit0ed348f4b81faafd8f0f8606170375375831212d (patch)
treeca0b38aed4c48a540483ca8dea7ae4b3a67ee174 /c/src/lib/libbsp/powerpc/shared/openpic
parent2005-12-01 Till Straumann <strauman@slac.stanford.edu> (diff)
downloadrtems-0ed348f4b81faafd8f0f8606170375375831212d.tar.bz2
2005-12-02 Till Straumann <strauman@slac.stanford.edu>
* shared/irq/irq_init.c, shared/openpic/openpic.h shared/openpic/openpic.c: The 8240's EPIC has a 'serial' mode of operation for multiplexing 16 interrupt lines. This introduces a pipeline delay which can cause spurious interrupts unless ending the interrupt cycle (EOI) is delayed accordingly.
Diffstat (limited to 'c/src/lib/libbsp/powerpc/shared/openpic')
-rw-r--r--c/src/lib/libbsp/powerpc/shared/openpic/openpic.c15
-rw-r--r--c/src/lib/libbsp/powerpc/shared/openpic/openpic.h7
2 files changed, 22 insertions, 0 deletions
diff --git a/c/src/lib/libbsp/powerpc/shared/openpic/openpic.c b/c/src/lib/libbsp/powerpc/shared/openpic/openpic.c
index 80af4d897b..ab9b8c49da 100644
--- a/c/src/lib/libbsp/powerpc/shared/openpic/openpic.c
+++ b/c/src/lib/libbsp/powerpc/shared/openpic/openpic.c
@@ -39,6 +39,10 @@ volatile struct OpenPIC *OpenPIC = NULL;
static unsigned int NumProcessors;
static unsigned int NumSources;
+#if defined(mpc8240) || defined(mpc8245)
+static unsigned int openpic_eoi_delay = 0;
+#endif
+
/*
* Accesses to the current processor's registers
*/
@@ -312,9 +316,20 @@ unsigned int openpic_irq(unsigned int cpu)
void openpic_eoi(unsigned int cpu)
{
check_arg_cpu(cpu);
+#if defined(mpc8240) || defined(mpc8245)
+ if ( openpic_eoi_delay )
+ rtems_bsp_delay_in_bus_cycles(openpic_eoi_delay);
+#endif
openpic_write(&OpenPIC->THIS_CPU.EOI, 0);
}
+#if defined(mpc8240) || defined(mpc8245)
+void openpic_set_eoi_delay(unsigned tb_cycles)
+{
+ openpic_eoi_delay = tb_cycles;
+}
+#endif
+
/*
* Get/set the current task priority
*/
diff --git a/c/src/lib/libbsp/powerpc/shared/openpic/openpic.h b/c/src/lib/libbsp/powerpc/shared/openpic/openpic.h
index e70a55605b..492742188f 100644
--- a/c/src/lib/libbsp/powerpc/shared/openpic/openpic.h
+++ b/c/src/lib/libbsp/powerpc/shared/openpic/openpic.h
@@ -43,6 +43,13 @@
#if defined(mpc8240) || defined(mpc8245)
#define OPENPIC_MAX_SOURCES (2048 - 16)
+/* If the BSP uses the serial interrupt mode / 'multiplexer' then
+ * EOI must be delayed by at least 16 SRAM_CLK cycles to avoid
+ * spurious interrupts.
+ * It is the BSP's responsibility to set up an appropriate delay
+ * (in timebase-clock cycles) at init time.
+ */
+extern void openpic_set_eoi_delay(unsigned tb_cycles);
#else
#define OPENPIC_MAX_SOURCES 2048
#endif