diff options
author | Till Straumann <strauman@slac.stanford.edu> | 2005-12-02 20:45:57 +0000 |
---|---|---|
committer | Till Straumann <strauman@slac.stanford.edu> | 2005-12-02 20:45:57 +0000 |
commit | 0ed348f4b81faafd8f0f8606170375375831212d (patch) | |
tree | ca0b38aed4c48a540483ca8dea7ae4b3a67ee174 /c/src/lib/libbsp/powerpc/shared/openpic | |
parent | 2005-12-01 Till Straumann <strauman@slac.stanford.edu> (diff) | |
download | rtems-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.c | 15 | ||||
-rw-r--r-- | c/src/lib/libbsp/powerpc/shared/openpic/openpic.h | 7 |
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 |