1 /*
2   NinjaSCSI I/O funtions
3       By: YOKOTA Hiroshi <yokota@netlab.is.tsukuba.ac.jp>
4 
5   This software may be used and distributed according to the terms of
6   the GNU General Public License.
7 
8   */
9 
10 /* $Id: nsp_io.h,v 1.3 2003/08/04 21:15:26 elca Exp $ */
11 
12 #ifndef __NSP_IO_H__
13 #define __NSP_IO_H__
14 
15 static inline          void nsp_write(unsigned int base,
16 				      unsigned int index,
17 				      unsigned char val);
18 static inline unsigned char nsp_read(unsigned int base,
19 				     unsigned int index);
20 static inline          void nsp_index_write(unsigned int BaseAddr,
21 					    unsigned int Register,
22 					    unsigned char Value);
23 static inline unsigned char nsp_index_read(unsigned int BaseAddr,
24 					   unsigned int Register);
25 
26 /*******************************************************************
27  * Basic IO
28  */
29 
nsp_write(unsigned int base,unsigned int index,unsigned char val)30 static inline void nsp_write(unsigned int  base,
31 			     unsigned int  index,
32 			     unsigned char val)
33 {
34 	outb(val, (base + index));
35 }
36 
nsp_read(unsigned int base,unsigned int index)37 static inline unsigned char nsp_read(unsigned int base,
38 				     unsigned int index)
39 {
40 	return inb(base + index);
41 }
42 
43 
44 /**********************************************************************
45  * Indexed IO
46  */
nsp_index_read(unsigned int BaseAddr,unsigned int Register)47 static inline unsigned char nsp_index_read(unsigned int BaseAddr,
48 					   unsigned int Register)
49 {
50 	outb(Register, BaseAddr + INDEXREG);
51 	return inb(BaseAddr + DATAREG);
52 }
53 
nsp_index_write(unsigned int BaseAddr,unsigned int Register,unsigned char Value)54 static inline void nsp_index_write(unsigned int  BaseAddr,
55 				   unsigned int  Register,
56 				   unsigned char Value)
57 {
58 	outb(Register, BaseAddr + INDEXREG);
59 	outb(Value, BaseAddr + DATAREG);
60 }
61 
62 /*********************************************************************
63  * fifo func
64  */
65 
66 /* read 8 bit FIFO */
nsp_multi_read_1(unsigned int BaseAddr,unsigned int Register,void * buf,unsigned long count)67 static inline void nsp_multi_read_1(unsigned int   BaseAddr,
68 				    unsigned int   Register,
69 				    void          *buf,
70 				    unsigned long  count)
71 {
72 	insb(BaseAddr + Register, buf, count);
73 }
74 
nsp_fifo8_read(unsigned int base,void * buf,unsigned long count)75 static inline void nsp_fifo8_read(unsigned int   base,
76 				  void          *buf,
77 				  unsigned long  count)
78 {
79 	/*nsp_dbg(NSP_DEBUG_DATA_IO, "buf=0x%p, count=0x%lx", buf, count);*/
80 	nsp_multi_read_1(base, FIFODATA, buf, count);
81 }
82 
83 /*--------------------------------------------------------------*/
84 
85 /* read 16 bit FIFO */
nsp_multi_read_2(unsigned int BaseAddr,unsigned int Register,void * buf,unsigned long count)86 static inline void nsp_multi_read_2(unsigned int   BaseAddr,
87 				    unsigned int   Register,
88 				    void          *buf,
89 				    unsigned long  count)
90 {
91 	insw(BaseAddr + Register, buf, count);
92 }
93 
nsp_fifo16_read(unsigned int base,void * buf,unsigned long count)94 static inline void nsp_fifo16_read(unsigned int   base,
95 				   void          *buf,
96 				   unsigned long  count)
97 {
98 	//nsp_dbg(NSP_DEBUG_DATA_IO, "buf=0x%p, count=0x%lx*2", buf, count);
99 	nsp_multi_read_2(base, FIFODATA, buf, count);
100 }
101 
102 /*--------------------------------------------------------------*/
103 
104 /* read 32bit FIFO */
nsp_multi_read_4(unsigned int BaseAddr,unsigned int Register,void * buf,unsigned long count)105 static inline void nsp_multi_read_4(unsigned int   BaseAddr,
106 				    unsigned int   Register,
107 				    void          *buf,
108 				    unsigned long  count)
109 {
110 	insl(BaseAddr + Register, buf, count);
111 }
112 
nsp_fifo32_read(unsigned int base,void * buf,unsigned long count)113 static inline void nsp_fifo32_read(unsigned int   base,
114 				   void          *buf,
115 				   unsigned long  count)
116 {
117 	//nsp_dbg(NSP_DEBUG_DATA_IO, "buf=0x%p, count=0x%lx*4", buf, count);
118 	nsp_multi_read_4(base, FIFODATA, buf, count);
119 }
120 
121 /*----------------------------------------------------------*/
122 
123 /* write 8bit FIFO */
nsp_multi_write_1(unsigned int BaseAddr,unsigned int Register,void * buf,unsigned long count)124 static inline void nsp_multi_write_1(unsigned int   BaseAddr,
125 				     unsigned int   Register,
126 				     void          *buf,
127 				     unsigned long  count)
128 {
129 	outsb(BaseAddr + Register, buf, count);
130 }
131 
nsp_fifo8_write(unsigned int base,void * buf,unsigned long count)132 static inline void nsp_fifo8_write(unsigned int   base,
133 				   void          *buf,
134 				   unsigned long  count)
135 {
136 	nsp_multi_write_1(base, FIFODATA, buf, count);
137 }
138 
139 /*---------------------------------------------------------*/
140 
141 /* write 16bit FIFO */
nsp_multi_write_2(unsigned int BaseAddr,unsigned int Register,void * buf,unsigned long count)142 static inline void nsp_multi_write_2(unsigned int   BaseAddr,
143 				     unsigned int   Register,
144 				     void          *buf,
145 				     unsigned long  count)
146 {
147 	outsw(BaseAddr + Register, buf, count);
148 }
149 
nsp_fifo16_write(unsigned int base,void * buf,unsigned long count)150 static inline void nsp_fifo16_write(unsigned int   base,
151 				    void          *buf,
152 				    unsigned long  count)
153 {
154 	nsp_multi_write_2(base, FIFODATA, buf, count);
155 }
156 
157 /*---------------------------------------------------------*/
158 
159 /* write 32bit FIFO */
nsp_multi_write_4(unsigned int BaseAddr,unsigned int Register,void * buf,unsigned long count)160 static inline void nsp_multi_write_4(unsigned int   BaseAddr,
161 				     unsigned int   Register,
162 				     void          *buf,
163 				     unsigned long  count)
164 {
165 	outsl(BaseAddr + Register, buf, count);
166 }
167 
nsp_fifo32_write(unsigned int base,void * buf,unsigned long count)168 static inline void nsp_fifo32_write(unsigned int   base,
169 				    void          *buf,
170 				    unsigned long  count)
171 {
172 	nsp_multi_write_4(base, FIFODATA, buf, count);
173 }
174 
175 
176 /*====================================================================*/
177 
nsp_mmio_write(unsigned long base,unsigned int index,unsigned char val)178 static inline void nsp_mmio_write(unsigned long base,
179 				  unsigned int  index,
180 				  unsigned char val)
181 {
182 	unsigned char *ptr = (unsigned char *)(base + NSP_MMIO_OFFSET + index);
183 
184 	writeb(val, ptr);
185 }
186 
nsp_mmio_read(unsigned long base,unsigned int index)187 static inline unsigned char nsp_mmio_read(unsigned long base,
188 					  unsigned int  index)
189 {
190 	unsigned char *ptr = (unsigned char *)(base + NSP_MMIO_OFFSET + index);
191 
192 	return readb(ptr);
193 }
194 
195 /*-----------*/
196 
nsp_mmio_index_read(unsigned long base,unsigned int reg)197 static inline unsigned char nsp_mmio_index_read(unsigned long base,
198 						unsigned int  reg)
199 {
200 	unsigned char *index_ptr = (unsigned char *)(base + NSP_MMIO_OFFSET + INDEXREG);
201 	unsigned char *data_ptr  = (unsigned char *)(base + NSP_MMIO_OFFSET + DATAREG);
202 
203 	writeb((unsigned char)reg, index_ptr);
204 	return readb(data_ptr);
205 }
206 
nsp_mmio_index_write(unsigned long base,unsigned int reg,unsigned char val)207 static inline void nsp_mmio_index_write(unsigned long base,
208 					unsigned int  reg,
209 					unsigned char val)
210 {
211 	unsigned char *index_ptr = (unsigned char *)(base + NSP_MMIO_OFFSET + INDEXREG);
212 	unsigned char *data_ptr  = (unsigned char *)(base + NSP_MMIO_OFFSET + DATAREG);
213 
214 	writeb((unsigned char)reg, index_ptr);
215 	writeb(val,                data_ptr);
216 }
217 
218 /* read 32bit FIFO */
nsp_mmio_multi_read_4(unsigned long base,unsigned int Register,void * buf,unsigned long count)219 static inline void nsp_mmio_multi_read_4(unsigned long  base,
220 					 unsigned int   Register,
221 					 void          *buf,
222 					 unsigned long  count)
223 {
224 	unsigned long *ptr = (unsigned long *)(base + Register);
225 	unsigned long *tmp = (unsigned long *)buf;
226 	int i;
227 
228 	//nsp_dbg(NSP_DEBUG_DATA_IO, "base 0x%0lx ptr 0x%p",base,ptr);
229 
230 	for (i = 0; i < count; i++) {
231 		*tmp = readl(ptr);
232 		//nsp_dbg(NSP_DEBUG_DATA_IO, "<%d,%p,%p,%lx>", i, ptr, tmp, *tmp);
233 		tmp++;
234 	}
235 }
236 
nsp_mmio_fifo32_read(unsigned int base,void * buf,unsigned long count)237 static inline void nsp_mmio_fifo32_read(unsigned int   base,
238 					void          *buf,
239 					unsigned long  count)
240 {
241 	//nsp_dbg(NSP_DEBUG_DATA_IO, "buf=0x%p, count=0x%lx*4", buf, count);
242 	nsp_mmio_multi_read_4(base, FIFODATA, buf, count);
243 }
244 
nsp_mmio_multi_write_4(unsigned long base,unsigned int Register,void * buf,unsigned long count)245 static inline void nsp_mmio_multi_write_4(unsigned long  base,
246 					  unsigned int   Register,
247 					  void          *buf,
248 					  unsigned long  count)
249 {
250 	unsigned long *ptr = (unsigned long *)(base + Register);
251 	unsigned long *tmp = (unsigned long *)buf;
252 	int i;
253 
254 	//nsp_dbg(NSP_DEBUG_DATA_IO, "base 0x%0lx ptr 0x%p",base,ptr);
255 
256 	for (i = 0; i < count; i++) {
257 		writel(*tmp, ptr);
258 		//nsp_dbg(NSP_DEBUG_DATA_IO, "<%d,%p,%p,%lx>", i, ptr, tmp, *tmp);
259 		tmp++;
260 	}
261 }
262 
nsp_mmio_fifo32_write(unsigned int base,void * buf,unsigned long count)263 static inline void nsp_mmio_fifo32_write(unsigned int   base,
264 					 void          *buf,
265 					 unsigned long  count)
266 {
267 	//nsp_dbg(NSP_DEBUG_DATA_IO, "buf=0x%p, count=0x%lx*4", buf, count);
268 	nsp_mmio_multi_write_4(base, FIFODATA, buf, count);
269 }
270 
271 
272 
273 #endif
274 /* end */
275