1
2
3
4
5
6
7#ifndef _ASM_SPARC_DMA_H
8#define _ASM_SPARC_DMA_H
9
10#include <linux/config.h>
11#include <linux/kernel.h>
12#include <linux/types.h>
13
14#include <asm/vac-ops.h>
15#include <asm/sbus.h>
16#include <asm/delay.h>
17#include <asm/oplib.h>
18#include <asm/system.h>
19#include <asm/io.h>
20#include <linux/spinlock.h>
21
22extern spinlock_t dma_spin_lock;
23
24static __inline__ unsigned long claim_dma_lock(void)
25{
26 unsigned long flags;
27 spin_lock_irqsave(&dma_spin_lock, flags);
28 return flags;
29}
30
31static __inline__ void release_dma_lock(unsigned long flags)
32{
33 spin_unlock_irqrestore(&dma_spin_lock, flags);
34}
35
36
37
38
39#define MAX_DMA_CHANNELS 8
40#define MAX_DMA_ADDRESS (~0UL)
41#define DMA_MODE_READ 1
42#define DMA_MODE_WRITE 2
43
44
45#define SIZE_16MB (16*1024*1024)
46#define SIZE_64K (64*1024)
47
48
49#define DMA_CSR 0x00UL
50#define DMA_ADDR 0x04UL
51#define DMA_COUNT 0x08UL
52#define DMA_TEST 0x0cUL
53
54
55enum dvma_rev {
56 dvmarev0,
57 dvmaesc1,
58 dvmarev1,
59 dvmarev2,
60 dvmarev3,
61 dvmarevplus,
62 dvmahme
63};
64
65#define DMA_HASCOUNT(rev) ((rev)==dvmaesc1)
66
67
68struct sbus_dma {
69 struct sbus_dma *next;
70 struct sbus_dev *sdev;
71 unsigned long regs;
72
73
74 int node;
75 int running;
76 int allocated;
77
78
79 unsigned long addr;
80 int nbytes;
81 int realbytes;
82
83
84 enum dvma_rev revision;
85};
86
87extern struct sbus_dma *dma_chain;
88
89
90#ifdef CONFIG_SUN4
91
92
93#define DMA_ISBROKEN(dma) ((dma)->revision == dvmarev0 || (dma)->revision == dvmarev1)
94#else
95#define DMA_ISBROKEN(dma) ((dma)->revision == dvmarev1)
96#endif
97#define DMA_ISESC1(dma) ((dma)->revision == dvmaesc1)
98
99
100extern void dvma_init(struct sbus_bus *);
101
102
103
104#define DMA_DEVICE_ID 0xf0000000
105#define DMA_VERS0 0x00000000
106#define DMA_ESCV1 0x40000000
107#define DMA_VERS1 0x80000000
108#define DMA_VERS2 0xa0000000
109#define DMA_VERHME 0xb0000000
110#define DMA_VERSPLUS 0x90000000
111
112#define DMA_HNDL_INTR 0x00000001
113#define DMA_HNDL_ERROR 0x00000002
114#define DMA_FIFO_ISDRAIN 0x0000000c
115#define DMA_INT_ENAB 0x00000010
116#define DMA_FIFO_INV 0x00000020
117#define DMA_ACC_SZ_ERR 0x00000040
118#define DMA_FIFO_STDRAIN 0x00000040
119#define DMA_RST_SCSI 0x00000080
120#define DMA_RST_ENET DMA_RST_SCSI
121#define DMA_RST_BPP DMA_RST_SCSI
122#define DMA_ST_WRITE 0x00000100
123#define DMA_ENABLE 0x00000200
124#define DMA_PEND_READ 0x00000400
125#define DMA_ESC_BURST 0x00000800
126#define DMA_READ_AHEAD 0x00001800
127#define DMA_DSBL_RD_DRN 0x00001000
128#define DMA_BCNT_ENAB 0x00002000
129#define DMA_TERM_CNTR 0x00004000
130#define DMA_SCSI_SBUS64 0x00008000
131#define DMA_CSR_DISAB 0x00010000
132#define DMA_SCSI_DISAB 0x00020000
133#define DMA_DSBL_WR_INV 0x00020000
134#define DMA_ADD_ENABLE 0x00040000
135#define DMA_E_BURSTS 0x000c0000
136#define DMA_E_BURST32 0x00040000
137#define DMA_E_BURST16 0x00000000
138#define DMA_BRST_SZ 0x000c0000
139#define DMA_BRST64 0x00080000
140#define DMA_BRST32 0x00040000
141#define DMA_BRST16 0x00000000
142#define DMA_BRST0 0x00080000
143#define DMA_ADDR_DISAB 0x00100000
144#define DMA_2CLKS 0x00200000
145#define DMA_3CLKS 0x00400000
146#define DMA_EN_ENETAUI DMA_3CLKS
147#define DMA_CNTR_DISAB 0x00800000
148#define DMA_AUTO_NADDR 0x01000000
149#define DMA_SCSI_ON 0x02000000
150#define DMA_BPP_ON DMA_SCSI_ON
151#define DMA_PARITY_OFF 0x02000000
152#define DMA_LOADED_ADDR 0x04000000
153#define DMA_LOADED_NADDR 0x08000000
154#define DMA_RESET_FAS366 0x08000000
155
156
157#define DMA_BURST1 0x01
158#define DMA_BURST2 0x02
159#define DMA_BURST4 0x04
160#define DMA_BURST8 0x08
161#define DMA_BURST16 0x10
162#define DMA_BURST32 0x20
163#define DMA_BURST64 0x40
164#define DMA_BURSTBITS 0x7f
165
166
167#define DMA_MAXEND(addr) (0x01000000UL-(((unsigned long)(addr))&0x00ffffffUL))
168
169
170#define DMA_ERROR_P(regs) ((((regs)->cond_reg) & DMA_HNDL_ERROR))
171#define DMA_IRQ_P(regs) ((((regs)->cond_reg) & (DMA_HNDL_INTR | DMA_HNDL_ERROR)))
172#define DMA_WRITE_P(regs) ((((regs)->cond_reg) & DMA_ST_WRITE))
173#define DMA_OFF(regs) ((((regs)->cond_reg) &= (~DMA_ENABLE)))
174#define DMA_INTSOFF(regs) ((((regs)->cond_reg) &= (~DMA_INT_ENAB)))
175#define DMA_INTSON(regs) ((((regs)->cond_reg) |= (DMA_INT_ENAB)))
176#define DMA_PUNTFIFO(regs) ((((regs)->cond_reg) |= DMA_FIFO_INV))
177#define DMA_SETSTART(regs, addr) ((((regs)->st_addr) = (char *) addr))
178#define DMA_BEGINDMA_W(regs) \
179 ((((regs)->cond_reg |= (DMA_ST_WRITE|DMA_ENABLE|DMA_INT_ENAB))))
180#define DMA_BEGINDMA_R(regs) \
181 ((((regs)->cond_reg |= ((DMA_ENABLE|DMA_INT_ENAB)&(~DMA_ST_WRITE)))))
182
183
184
185
186
187
188#define DMA_IRQ_ENTRY(dma, dregs) do { \
189 if(DMA_ISBROKEN(dma)) DMA_INTSOFF(dregs); \
190 } while (0)
191
192#define DMA_IRQ_EXIT(dma, dregs) do { \
193 if(DMA_ISBROKEN(dma)) DMA_INTSON(dregs); \
194 } while(0)
195
196#if 0
197
198
199
200extern __inline__ void sparc_dma_pause(struct sparc_dma_registers *regs,
201 unsigned long bit)
202{
203 int ctr = 50000;
204
205
206 while((regs->cond_reg&bit) && (ctr>0)) {
207 ctr--;
208 __delay(5);
209 }
210
211
212 if(!ctr)
213 panic("DMA timeout");
214}
215
216
217#define DMA_RESET(dma) do { \
218 struct sparc_dma_registers *regs = dma->regs; \
219 \
220 sparc_dma_pause(regs, (DMA_FIFO_ISDRAIN)); \
221 \
222 regs->cond_reg |= (DMA_RST_SCSI); \
223 __delay(400); \
224 regs->cond_reg &= ~(DMA_RST_SCSI); \
225 sparc_dma_enable_interrupts(regs); \
226 \
227 if(dma->revision>dvmarev1) regs->cond_reg |= DMA_3CLKS; \
228 dma->running = 0; \
229} while(0)
230#endif
231
232#define for_each_dvma(dma) \
233 for((dma) = dma_chain; (dma); (dma) = (dma)->next)
234
235extern int get_dma_list(char *);
236extern int request_dma(unsigned int, __const__ char *);
237extern void free_dma(unsigned int);
238
239
240
241#ifdef CONFIG_PCI
242extern int isa_dma_bridge_buggy;
243#else
244#define isa_dma_bridge_buggy (0)
245#endif
246
247#endif
248