149148020SSam Ravnborg /*
249148020SSam Ravnborg ** atariints.h -- Atari Linux interrupt handling structs and prototypes
349148020SSam Ravnborg **
449148020SSam Ravnborg ** Copyright 1994 by Björn Brauel
549148020SSam Ravnborg **
649148020SSam Ravnborg ** 5/2/94 Roman Hodek:
749148020SSam Ravnborg ** TT interrupt definitions added.
849148020SSam Ravnborg **
949148020SSam Ravnborg ** 12/02/96: (Roman)
1049148020SSam Ravnborg ** Adapted to new int handling scheme (see ataints.c); revised numbering
1149148020SSam Ravnborg **
1249148020SSam Ravnborg ** This file is subject to the terms and conditions of the GNU General Public
1349148020SSam Ravnborg ** License. See the file COPYING in the main directory of this archive
1449148020SSam Ravnborg ** for more details.
1549148020SSam Ravnborg **
1649148020SSam Ravnborg */
1749148020SSam Ravnborg
1849148020SSam Ravnborg #ifndef _LINUX_ATARIINTS_H_
1949148020SSam Ravnborg #define _LINUX_ATARIINTS_H_
2049148020SSam Ravnborg
2149148020SSam Ravnborg #include <asm/irq.h>
2249148020SSam Ravnborg #include <asm/atarihw.h>
2349148020SSam Ravnborg
2449148020SSam Ravnborg /*
2549148020SSam Ravnborg ** Atari Interrupt sources.
2649148020SSam Ravnborg **
2749148020SSam Ravnborg */
2849148020SSam Ravnborg
2949148020SSam Ravnborg #define STMFP_SOURCE_BASE 8
3049148020SSam Ravnborg #define TTMFP_SOURCE_BASE 24
3149148020SSam Ravnborg #define SCC_SOURCE_BASE 40
3249148020SSam Ravnborg #define VME_SOURCE_BASE 56
3349148020SSam Ravnborg #define VME_MAX_SOURCES 16
3449148020SSam Ravnborg
35736b24dbSMichael Schmitz #define NUM_ATARI_SOURCES 141
3649148020SSam Ravnborg
3749148020SSam Ravnborg /* convert vector number to int source number */
3849148020SSam Ravnborg #define IRQ_VECTOR_TO_SOURCE(v) ((v) - ((v) < 0x20 ? 0x18 : (0x40-8)))
3949148020SSam Ravnborg
4049148020SSam Ravnborg /* convert irq_handler index to vector number */
4149148020SSam Ravnborg #define IRQ_SOURCE_TO_VECTOR(i) ((i) + ((i) < 8 ? 0x18 : (0x40-8)))
4249148020SSam Ravnborg
4349148020SSam Ravnborg /* ST-MFP interrupts */
4449148020SSam Ravnborg #define IRQ_MFP_BUSY (8)
4549148020SSam Ravnborg #define IRQ_MFP_DCD (9)
4649148020SSam Ravnborg #define IRQ_MFP_CTS (10)
4749148020SSam Ravnborg #define IRQ_MFP_GPU (11)
4849148020SSam Ravnborg #define IRQ_MFP_TIMD (12)
4949148020SSam Ravnborg #define IRQ_MFP_TIMC (13)
5049148020SSam Ravnborg #define IRQ_MFP_ACIA (14)
5149148020SSam Ravnborg #define IRQ_MFP_FDC (15)
5249148020SSam Ravnborg #define IRQ_MFP_ACSI IRQ_MFP_FDC
5349148020SSam Ravnborg #define IRQ_MFP_FSCSI IRQ_MFP_FDC
5449148020SSam Ravnborg #define IRQ_MFP_IDE IRQ_MFP_FDC
5549148020SSam Ravnborg #define IRQ_MFP_TIMB (16)
5649148020SSam Ravnborg #define IRQ_MFP_SERERR (17)
5749148020SSam Ravnborg #define IRQ_MFP_SEREMPT (18)
5849148020SSam Ravnborg #define IRQ_MFP_RECERR (19)
5949148020SSam Ravnborg #define IRQ_MFP_RECFULL (20)
6049148020SSam Ravnborg #define IRQ_MFP_TIMA (21)
6149148020SSam Ravnborg #define IRQ_MFP_RI (22)
6249148020SSam Ravnborg #define IRQ_MFP_MMD (23)
6349148020SSam Ravnborg
6449148020SSam Ravnborg /* TT-MFP interrupts */
6549148020SSam Ravnborg #define IRQ_TT_MFP_IO0 (24)
6649148020SSam Ravnborg #define IRQ_TT_MFP_IO1 (25)
6749148020SSam Ravnborg #define IRQ_TT_MFP_SCC (26)
6849148020SSam Ravnborg #define IRQ_TT_MFP_RI (27)
6949148020SSam Ravnborg #define IRQ_TT_MFP_TIMD (28)
7049148020SSam Ravnborg #define IRQ_TT_MFP_TIMC (29)
7149148020SSam Ravnborg #define IRQ_TT_MFP_DRVRDY (30)
7249148020SSam Ravnborg #define IRQ_TT_MFP_SCSIDMA (31)
7349148020SSam Ravnborg #define IRQ_TT_MFP_TIMB (32)
7449148020SSam Ravnborg #define IRQ_TT_MFP_SERERR (33)
7549148020SSam Ravnborg #define IRQ_TT_MFP_SEREMPT (34)
7649148020SSam Ravnborg #define IRQ_TT_MFP_RECERR (35)
7749148020SSam Ravnborg #define IRQ_TT_MFP_RECFULL (36)
7849148020SSam Ravnborg #define IRQ_TT_MFP_TIMA (37)
7949148020SSam Ravnborg #define IRQ_TT_MFP_RTC (38)
8049148020SSam Ravnborg #define IRQ_TT_MFP_SCSI (39)
8149148020SSam Ravnborg
8249148020SSam Ravnborg /* SCC interrupts */
8349148020SSam Ravnborg #define IRQ_SCCB_TX (40)
8449148020SSam Ravnborg #define IRQ_SCCB_STAT (42)
8549148020SSam Ravnborg #define IRQ_SCCB_RX (44)
8649148020SSam Ravnborg #define IRQ_SCCB_SPCOND (46)
8749148020SSam Ravnborg #define IRQ_SCCA_TX (48)
8849148020SSam Ravnborg #define IRQ_SCCA_STAT (50)
8949148020SSam Ravnborg #define IRQ_SCCA_RX (52)
9049148020SSam Ravnborg #define IRQ_SCCA_SPCOND (54)
9149148020SSam Ravnborg
92b1ae432cSMichael Schmitz /* shared MFP timer D interrupts - hires timer for EtherNEC et al. */
93b1ae432cSMichael Schmitz #define IRQ_MFP_TIMER1 (64)
94b1ae432cSMichael Schmitz #define IRQ_MFP_TIMER2 (65)
95b1ae432cSMichael Schmitz #define IRQ_MFP_TIMER3 (66)
96b1ae432cSMichael Schmitz #define IRQ_MFP_TIMER4 (67)
97b1ae432cSMichael Schmitz #define IRQ_MFP_TIMER5 (68)
98b1ae432cSMichael Schmitz #define IRQ_MFP_TIMER6 (69)
99b1ae432cSMichael Schmitz #define IRQ_MFP_TIMER7 (70)
100b1ae432cSMichael Schmitz #define IRQ_MFP_TIMER8 (71)
10149148020SSam Ravnborg
10249148020SSam Ravnborg #define INT_CLK 24576 /* CLK while int_clk =2.456MHz and divide = 100 */
10349148020SSam Ravnborg #define INT_TICKS 246 /* to make sched_time = 99.902... HZ */
10449148020SSam Ravnborg
10549148020SSam Ravnborg
10649148020SSam Ravnborg #define MFP_ENABLE 0
10749148020SSam Ravnborg #define MFP_PENDING 1
10849148020SSam Ravnborg #define MFP_SERVICE 2
10949148020SSam Ravnborg #define MFP_MASK 3
11049148020SSam Ravnborg
11149148020SSam Ravnborg /* Utility functions for setting/clearing bits in the interrupt registers of
11249148020SSam Ravnborg * the MFP. 'type' should be constant, if 'irq' is constant, too, code size is
11349148020SSam Ravnborg * reduced. set_mfp_bit() is nonsense for PENDING and SERVICE registers. */
11449148020SSam Ravnborg
get_mfp_bit(unsigned irq,int type)11549148020SSam Ravnborg static inline int get_mfp_bit( unsigned irq, int type )
11649148020SSam Ravnborg
11749148020SSam Ravnborg { unsigned char mask, *reg;
11849148020SSam Ravnborg
11949148020SSam Ravnborg mask = 1 << (irq & 7);
1203d92e8f3SGeert Uytterhoeven reg = (unsigned char *)&st_mfp.int_en_a + type*4 +
12149148020SSam Ravnborg ((irq & 8) >> 2) + (((irq-8) & 16) << 3);
12249148020SSam Ravnborg return( *reg & mask );
12349148020SSam Ravnborg }
12449148020SSam Ravnborg
set_mfp_bit(unsigned irq,int type)12549148020SSam Ravnborg static inline void set_mfp_bit( unsigned irq, int type )
12649148020SSam Ravnborg
12749148020SSam Ravnborg { unsigned char mask, *reg;
12849148020SSam Ravnborg
12949148020SSam Ravnborg mask = 1 << (irq & 7);
1303d92e8f3SGeert Uytterhoeven reg = (unsigned char *)&st_mfp.int_en_a + type*4 +
13149148020SSam Ravnborg ((irq & 8) >> 2) + (((irq-8) & 16) << 3);
13249148020SSam Ravnborg __asm__ __volatile__ ( "orb %0,%1"
13349148020SSam Ravnborg : : "di" (mask), "m" (*reg) : "memory" );
13449148020SSam Ravnborg }
13549148020SSam Ravnborg
clear_mfp_bit(unsigned irq,int type)13649148020SSam Ravnborg static inline void clear_mfp_bit( unsigned irq, int type )
13749148020SSam Ravnborg
13849148020SSam Ravnborg { unsigned char mask, *reg;
13949148020SSam Ravnborg
14049148020SSam Ravnborg mask = ~(1 << (irq & 7));
1413d92e8f3SGeert Uytterhoeven reg = (unsigned char *)&st_mfp.int_en_a + type*4 +
14249148020SSam Ravnborg ((irq & 8) >> 2) + (((irq-8) & 16) << 3);
14349148020SSam Ravnborg if (type == MFP_PENDING || type == MFP_SERVICE)
14449148020SSam Ravnborg __asm__ __volatile__ ( "moveb %0,%1"
14549148020SSam Ravnborg : : "di" (mask), "m" (*reg) : "memory" );
14649148020SSam Ravnborg else
14749148020SSam Ravnborg __asm__ __volatile__ ( "andb %0,%1"
14849148020SSam Ravnborg : : "di" (mask), "m" (*reg) : "memory" );
14949148020SSam Ravnborg }
15049148020SSam Ravnborg
15149148020SSam Ravnborg /*
15249148020SSam Ravnborg * {en,dis}able_irq have the usual semantics of temporary blocking the
15325985edcSLucas De Marchi * interrupt, but not losing requests that happen between disabling and
15449148020SSam Ravnborg * enabling. This is done with the MFP mask registers.
15549148020SSam Ravnborg */
15649148020SSam Ravnborg
atari_enable_irq(unsigned irq)15749148020SSam Ravnborg static inline void atari_enable_irq( unsigned irq )
15849148020SSam Ravnborg
15949148020SSam Ravnborg {
16049148020SSam Ravnborg if (irq < STMFP_SOURCE_BASE || irq >= SCC_SOURCE_BASE) return;
16149148020SSam Ravnborg set_mfp_bit( irq, MFP_MASK );
16249148020SSam Ravnborg }
16349148020SSam Ravnborg
atari_disable_irq(unsigned irq)16449148020SSam Ravnborg static inline void atari_disable_irq( unsigned irq )
16549148020SSam Ravnborg
16649148020SSam Ravnborg {
16749148020SSam Ravnborg if (irq < STMFP_SOURCE_BASE || irq >= SCC_SOURCE_BASE) return;
16849148020SSam Ravnborg clear_mfp_bit( irq, MFP_MASK );
16949148020SSam Ravnborg }
17049148020SSam Ravnborg
17149148020SSam Ravnborg /*
17249148020SSam Ravnborg * In opposite to {en,dis}able_irq, requests between turn{off,on}_irq are not
17349148020SSam Ravnborg * "stored"
17449148020SSam Ravnborg */
17549148020SSam Ravnborg
atari_turnon_irq(unsigned irq)17649148020SSam Ravnborg static inline void atari_turnon_irq( unsigned irq )
17749148020SSam Ravnborg
17849148020SSam Ravnborg {
17949148020SSam Ravnborg if (irq < STMFP_SOURCE_BASE || irq >= SCC_SOURCE_BASE) return;
18049148020SSam Ravnborg set_mfp_bit( irq, MFP_ENABLE );
18149148020SSam Ravnborg }
18249148020SSam Ravnborg
atari_turnoff_irq(unsigned irq)18349148020SSam Ravnborg static inline void atari_turnoff_irq( unsigned irq )
18449148020SSam Ravnborg
18549148020SSam Ravnborg {
18649148020SSam Ravnborg if (irq < STMFP_SOURCE_BASE || irq >= SCC_SOURCE_BASE) return;
18749148020SSam Ravnborg clear_mfp_bit( irq, MFP_ENABLE );
18849148020SSam Ravnborg clear_mfp_bit( irq, MFP_PENDING );
18949148020SSam Ravnborg }
19049148020SSam Ravnborg
atari_clear_pending_irq(unsigned irq)19149148020SSam Ravnborg static inline void atari_clear_pending_irq( unsigned irq )
19249148020SSam Ravnborg
19349148020SSam Ravnborg {
19449148020SSam Ravnborg if (irq < STMFP_SOURCE_BASE || irq >= SCC_SOURCE_BASE) return;
19549148020SSam Ravnborg clear_mfp_bit( irq, MFP_PENDING );
19649148020SSam Ravnborg }
19749148020SSam Ravnborg
atari_irq_pending(unsigned irq)19849148020SSam Ravnborg static inline int atari_irq_pending( unsigned irq )
19949148020SSam Ravnborg
20049148020SSam Ravnborg {
20149148020SSam Ravnborg if (irq < STMFP_SOURCE_BASE || irq >= SCC_SOURCE_BASE) return( 0 );
20249148020SSam Ravnborg return( get_mfp_bit( irq, MFP_PENDING ) );
20349148020SSam Ravnborg }
20449148020SSam Ravnborg
20544883eb0SGeert Uytterhoeven unsigned int atari_register_vme_int(void);
20644883eb0SGeert Uytterhoeven void atari_unregister_vme_int(unsigned int);
20749148020SSam Ravnborg
20849148020SSam Ravnborg #endif /* linux/atariints.h */
209