This source file includes following definitions.
- sparc_dma_pause
- sparc_dma_enable_interrupts
- sparc_dma_disable_interrupts
- sparc_dma_reset
1
2
3
4
5
6
7
8
9
10
11 #ifndef _ASM_SPARC_DMA_H
12 #define _ASM_SPARC_DMA_H
13
14 #include <asm/vac-ops.h>
15 #include <asm/sbus.h>
16 #include <asm/delay.h>
17 #include <asm/oplib.h>
18
19
20 extern unsigned long probe_dma(unsigned long);
21
22
23
24
25 #define MAX_DMA_CHANNELS 8
26 #define MAX_DMA_ADDRESS 0x0
27
28
29 struct sparc_dma_registers {
30 volatile unsigned long cond_reg;
31 volatile char * st_addr;
32 volatile unsigned long cnt;
33 volatile unsigned long dma_test;
34 };
35
36
37 struct Linux_SBus_DMA {
38 struct linux_sbus_device *SBus_dev;
39 struct sparc_dma_registers *DMA_regs;
40
41
42 int node;
43 int dma_running;
44
45
46 int dma_rev;
47 };
48
49 extern struct Linux_SBus_DMA Sparc_DMA;
50
51
52 extern void dump_dma_regs(struct sparc_dma_registers *);
53 extern unsigned long probe_dma(unsigned long);
54 extern void sparc_dma_init_transfer(struct sparc_dma_registers *,
55 unsigned long, int, int);
56 extern int sparc_dma_interrupt(struct sparc_dma_registers *);
57
58
59
60 #define DMA_DEVICE_ID 0xf0000000
61 #define DMA_VERS0 0x00000000
62 #define DMA_VERS1 0x80000000
63 #define DMA_VERS2 0xa0000000
64 #define DMA_VERSPLUS 0x90000000
65
66 #define DMA_HNDL_INTR 0x00000001
67 #define DMA_HNDL_ERROR 0x00000002
68 #define DMA_FIFO_ISDRAIN 0x0000000c
69 #define DMA_INT_ENAB 0x00000010
70 #define DMA_FIFO_INV 0x00000020
71 #define DMA_ACC_SZ_ERR 0x00000040
72 #define DMA_FIFO_STDRAIN 0x00000040
73 #define DMA_RST_SCSI 0x00000080
74 #define DMA_ST_WRITE 0x00000100
75 #define DMA_ENABLE 0x00000200
76 #define DMA_PEND_READ 0x00000400
77 #define DMA_BCNT_ENAB 0x00002000
78 #define DMA_TERM_CNTR 0x00004000
79 #define DMA_CSR_DISAB 0x00010000
80 #define DMA_SCSI_DISAB 0x00020000
81 #define DMA_BRST_SZ 0x000c0000
82 #define DMA_ADDR_DISAB 0x00100000
83 #define DMA_2CLKS 0x00200000
84 #define DMA_3CLKS 0x00400000
85 #define DMA_CNTR_DISAB 0x00800000
86 #define DMA_AUTO_NADDR 0x01000000
87 #define DMA_SCSI_ON 0x02000000
88 #define DMA_LOADED_ADDR 0x04000000
89 #define DMA_LOADED_NADDR 0x08000000
90
91
92 #define DMA_BYTE_CNT_MASK 0x00ffffff
93
94
95
96
97 extern inline void sparc_dma_pause(struct sparc_dma_registers *dma_regs,
98 unsigned long bit)
99 {
100 int ctr = 50000;
101
102
103 while((dma_regs->cond_reg&bit) && (ctr>0)) {
104 ctr--;
105 __delay(1);
106 }
107
108
109 if(ctr==0) {
110 printk("DMA Grrr: I tried for wait for the assertion of bit %08xl to clear",
111 (unsigned int) bit);
112 printk(" in the DMA condition register and it did not!\n");
113 printk("Cannot continue, halting...\n");
114 prom_halt();
115 }
116
117 return;
118 }
119
120
121 extern inline void sparc_dma_enable_interrupts(struct sparc_dma_registers *dma_regs)
122 {
123 dma_regs->cond_reg |= DMA_INT_ENAB;
124 }
125
126
127 extern inline void sparc_dma_disable_interrupts(struct sparc_dma_registers *dma_regs)
128 {
129 dma_regs->cond_reg &= ~(DMA_INT_ENAB);
130 }
131
132
133 extern inline void sparc_dma_reset(struct sparc_dma_registers *dma_regs)
134 {
135
136 sparc_dma_pause(dma_regs, (DMA_FIFO_ISDRAIN));
137
138
139 dma_regs->cond_reg |= (DMA_RST_SCSI);
140 __delay(400);
141 dma_regs->cond_reg &= ~(DMA_RST_SCSI);
142
143 sparc_dma_enable_interrupts(dma_regs);
144
145
146 if(Sparc_DMA.dma_rev>1) { dma_regs->cond_reg |= DMA_3CLKS; }
147 Sparc_DMA.dma_running = 0;
148
149 return;
150 }
151
152 #endif