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