OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [linux/] [linux-2.4/] [include/] [asm-m68k/] [atariints.h] - Blame information for rev 1774

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 1276 phoenix
/*
2
** atariints.h -- Atari Linux interrupt handling structs and prototypes
3
**
4
** Copyright 1994 by Bj”rn Brauel
5
**
6
** 5/2/94 Roman Hodek:
7
**   TT interrupt definitions added.
8
**
9
** 12/02/96: (Roman)
10
**   Adapted to new int handling scheme (see ataints.c); revised numbering
11
**
12
** This file is subject to the terms and conditions of the GNU General Public
13
** License.  See the file COPYING in the main directory of this archive
14
** for more details.
15
**
16
*/
17
 
18
#ifndef _LINUX_ATARIINTS_H_
19
#define _LINUX_ATARIINTS_H_
20
 
21
#include <asm/irq.h>
22
#include <asm/atarihw.h>
23
 
24
/*
25
** Atari Interrupt sources.
26
**
27
*/
28
 
29
#define STMFP_SOURCE_BASE  8
30
#define TTMFP_SOURCE_BASE  24
31
#define SCC_SOURCE_BASE    40
32
#define VME_SOURCE_BASE    56
33
#define VME_MAX_SOURCES    16
34
 
35
#define NUM_ATARI_SOURCES   (VME_SOURCE_BASE+VME_MAX_SOURCES-STMFP_SOURCE_BASE)
36
 
37
/* convert vector number to int source number */
38
#define IRQ_VECTOR_TO_SOURCE(v) ((v) - ((v) < 0x20 ? 0x18 : (0x40-8)))
39
 
40
/* convert irq_handler index to vector number */
41
#define IRQ_SOURCE_TO_VECTOR(i) ((i) + ((i) < 8 ? 0x18 : (0x40-8)))
42
 
43
/* interrupt service types */
44
#define IRQ_TYPE_SLOW     0
45
#define IRQ_TYPE_FAST     1
46
#define IRQ_TYPE_PRIO     2
47
 
48
#define IRQ_SPURIOUS      (0)
49
 
50
/* auto-vector interrupts */
51
#define IRQ_AUTO_1        (1)
52
#define IRQ_AUTO_2        (2)
53
#define IRQ_AUTO_3        (3)
54
#define IRQ_AUTO_4        (4)
55
#define IRQ_AUTO_5        (5)
56
#define IRQ_AUTO_6        (6)
57
#define IRQ_AUTO_7        (7)
58
 
59
/* ST-MFP interrupts */
60
#define IRQ_MFP_BUSY      (8)
61
#define IRQ_MFP_DCD       (9)
62
#define IRQ_MFP_CTS       (10)
63
#define IRQ_MFP_GPU       (11)
64
#define IRQ_MFP_TIMD      (12)
65
#define IRQ_MFP_TIMC      (13)
66
#define IRQ_MFP_ACIA      (14)
67
#define IRQ_MFP_FDC       (15)
68
#define IRQ_MFP_ACSI      IRQ_MFP_FDC
69
#define IRQ_MFP_FSCSI     IRQ_MFP_FDC
70
#define IRQ_MFP_IDE       IRQ_MFP_FDC
71
#define IRQ_MFP_TIMB      (16)
72
#define IRQ_MFP_SERERR    (17)
73
#define IRQ_MFP_SEREMPT   (18)
74
#define IRQ_MFP_RECERR    (19)
75
#define IRQ_MFP_RECFULL   (20)
76
#define IRQ_MFP_TIMA      (21)
77
#define IRQ_MFP_RI        (22)
78
#define IRQ_MFP_MMD       (23)
79
 
80
/* TT-MFP interrupts */
81
#define IRQ_TT_MFP_IO0       (24)
82
#define IRQ_TT_MFP_IO1       (25)
83
#define IRQ_TT_MFP_SCC       (26)
84
#define IRQ_TT_MFP_RI        (27)
85
#define IRQ_TT_MFP_TIMD      (28)
86
#define IRQ_TT_MFP_TIMC      (29)
87
#define IRQ_TT_MFP_DRVRDY    (30)
88
#define IRQ_TT_MFP_SCSIDMA   (31)
89
#define IRQ_TT_MFP_TIMB      (32)
90
#define IRQ_TT_MFP_SERERR    (33)
91
#define IRQ_TT_MFP_SEREMPT   (34)
92
#define IRQ_TT_MFP_RECERR    (35)
93
#define IRQ_TT_MFP_RECFULL   (36)
94
#define IRQ_TT_MFP_TIMA      (37)
95
#define IRQ_TT_MFP_RTC       (38)
96
#define IRQ_TT_MFP_SCSI      (39)
97
 
98
/* SCC interrupts */
99
#define IRQ_SCCB_TX          (40)
100
#define IRQ_SCCB_STAT        (42)
101
#define IRQ_SCCB_RX          (44)
102
#define IRQ_SCCB_SPCOND      (46)
103
#define IRQ_SCCA_TX          (48)
104
#define IRQ_SCCA_STAT        (50)
105
#define IRQ_SCCA_RX          (52)
106
#define IRQ_SCCA_SPCOND      (54)
107
 
108
 
109
#define INT_CLK   24576     /* CLK while int_clk =2.456MHz and divide = 100 */
110
#define INT_TICKS 246       /* to make sched_time = 99.902... HZ */
111
 
112
 
113
#define MFP_ENABLE      0
114
#define MFP_PENDING     1
115
#define MFP_SERVICE     2
116
#define MFP_MASK        3
117
 
118
/* Utility functions for setting/clearing bits in the interrupt registers of
119
 * the MFP. 'type' should be constant, if 'irq' is constant, too, code size is
120
 * reduced. set_mfp_bit() is nonsense for PENDING and SERVICE registers. */
121
 
122
static inline int get_mfp_bit( unsigned irq, int type )
123
 
124
{       unsigned char   mask, *reg;
125
 
126
        mask = 1 << (irq & 7);
127
        reg = (unsigned char *)&mfp.int_en_a + type*4 +
128
                  ((irq & 8) >> 2) + (((irq-8) & 16) << 3);
129
        return( *reg & mask );
130
}
131
 
132
static inline void set_mfp_bit( unsigned irq, int type )
133
 
134
{       unsigned char   mask, *reg;
135
 
136
        mask = 1 << (irq & 7);
137
        reg = (unsigned char *)&mfp.int_en_a + type*4 +
138
                  ((irq & 8) >> 2) + (((irq-8) & 16) << 3);
139
        __asm__ __volatile__ ( "orb %0,%1"
140
                              : : "di" (mask), "m" (*reg) : "memory" );
141
}
142
 
143
static inline void clear_mfp_bit( unsigned irq, int type )
144
 
145
{       unsigned char   mask, *reg;
146
 
147
        mask = ~(1 << (irq & 7));
148
        reg = (unsigned char *)&mfp.int_en_a + type*4 +
149
                  ((irq & 8) >> 2) + (((irq-8) & 16) << 3);
150
        if (type == MFP_PENDING || type == MFP_SERVICE)
151
                __asm__ __volatile__ ( "moveb %0,%1"
152
                                      : : "di" (mask), "m" (*reg) : "memory" );
153
        else
154
                __asm__ __volatile__ ( "andb %0,%1"
155
                                      : : "di" (mask), "m" (*reg) : "memory" );
156
}
157
 
158
/*
159
 * {en,dis}able_irq have the usual semantics of temporary blocking the
160
 * interrupt, but not loosing requests that happen between disabling and
161
 * enabling. This is done with the MFP mask registers.
162
 */
163
 
164
static inline void atari_enable_irq( unsigned irq )
165
 
166
{
167
        if (irq < STMFP_SOURCE_BASE || irq >= SCC_SOURCE_BASE) return;
168
        set_mfp_bit( irq, MFP_MASK );
169
}
170
 
171
static inline void atari_disable_irq( unsigned irq )
172
 
173
{
174
        if (irq < STMFP_SOURCE_BASE || irq >= SCC_SOURCE_BASE) return;
175
        clear_mfp_bit( irq, MFP_MASK );
176
}
177
 
178
/*
179
 * In opposite to {en,dis}able_irq, requests between turn{off,on}_irq are not
180
 * "stored"
181
 */
182
 
183
static inline void atari_turnon_irq( unsigned irq )
184
 
185
{
186
        if (irq < STMFP_SOURCE_BASE || irq >= SCC_SOURCE_BASE) return;
187
        set_mfp_bit( irq, MFP_ENABLE );
188
}
189
 
190
static inline void atari_turnoff_irq( unsigned irq )
191
 
192
{
193
        if (irq < STMFP_SOURCE_BASE || irq >= SCC_SOURCE_BASE) return;
194
        clear_mfp_bit( irq, MFP_ENABLE );
195
        clear_mfp_bit( irq, MFP_PENDING );
196
}
197
 
198
static inline void atari_clear_pending_irq( unsigned irq )
199
 
200
{
201
        if (irq < STMFP_SOURCE_BASE || irq >= SCC_SOURCE_BASE) return;
202
        clear_mfp_bit( irq, MFP_PENDING );
203
}
204
 
205
static inline int atari_irq_pending( unsigned irq )
206
 
207
{
208
        if (irq < STMFP_SOURCE_BASE || irq >= SCC_SOURCE_BASE) return( 0 );
209
        return( get_mfp_bit( irq, MFP_PENDING ) );
210
}
211
 
212
unsigned long atari_register_vme_int( void );
213
void atari_unregister_vme_int( unsigned long );
214
 
215
#endif /* linux/atariints.h */

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.