1 /*************************************************/
2 /* here we define sanei_inb/sanei_outb based on */
3 /* OS dependent inb/outb definitions */
4 /* SANE_INB is defined whenever a valid inb/outb */
5 /* definition has been found */
6 /*************************************************/
7
8 #include "../include/sane/config.h"
9
10 #include <errno.h>
11 #include <stdlib.h>
12 #include <string.h>
13
14 #include <sys/types.h>
15
16 #include "../include/sane/sane.h"
17 #include "../include/sane/sanei.h"
18 #include "../include/sane/sanei_directio.h"
19
20 #ifdef ENABLE_PARPORT_DIRECTIO
21
22 #define TEST_SANE_INB(val) ( SANE_INB == val )
23
24 #if ( TEST_SANE_INB(1) ) /* OS/2 EMX case */
25 int
sanei_ioperm(int start,int length,int enable)26 sanei_ioperm (int start, int length, int enable)
27 {
28 if (enable)
29 return _portaccess (port, port + length - 1);
30 return 0;
31 }
32
33 unsigned char
sanei_inb(unsigned int port)34 sanei_inb (unsigned int port)
35 {
36 return _inp8 (port) & 0xFF;
37 }
38
39 void
sanei_outb(unsigned int port,unsigned char value)40 sanei_outb (unsigned int port, unsigned char value)
41 {
42 _outp8 (port, value);
43 }
44
45 void
sanei_insb(unsigned int port,unsigned char * addr,unsigned long count)46 sanei_insb (unsigned int port, unsigned char *addr, unsigned long count)
47 {
48 _inps8 (port, (unsigned char *) addr, count);
49 }
50
51 void
sanei_insl(unsigned int port,unsigned char * addr,unsigned long count)52 sanei_insl (unsigned int port, unsigned char *addr, unsigned long count)
53 {
54 _inps32 (port, (unsigned long *) addr, count);
55 }
56
57 void
sanei_outsb(unsigned int port,const unsigned char * addr,unsigned long count)58 sanei_outsb (unsigned int port, const unsigned char *addr,
59 unsigned long count)
60 {
61 _outps8 (port, (unsigned char *) addr, count);
62 }
63
64 void
sanei_outsl(unsigned int port,const unsigned char * addr,unsigned long count)65 sanei_outsl (unsigned int port, const unsigned char *addr,
66 unsigned long count)
67 {
68 _outps32 (port, (unsigned long *) addr, count);
69 }
70 #endif /* OS/2 EMX case */
71
72
73
74 #if ( TEST_SANE_INB(2) ) /* FreeBSD case */
75 int
sanei_ioperm(int start,int length,int enable)76 sanei_ioperm (int start, int length, int enable)
77 {
78 #ifdef HAVE_I386_SET_IOPERM
79 return i386_set_ioperm (start, length, enable);
80 #else
81 int fd = 0;
82
83 /* makes compilers happy */
84 start = length + enable;
85 fd = open ("/dev/io", O_RDONLY);
86 if (fd > 0)
87 return 0;
88 return -1;
89 #endif
90 }
91
92 unsigned char
sanei_inb(unsigned int port)93 sanei_inb (unsigned int port)
94 {
95 return inb (port);
96 }
97
98 void
sanei_outb(unsigned int port,unsigned char value)99 sanei_outb (unsigned int port, unsigned char value)
100 {
101 outb (port, value);
102 }
103
104 void
sanei_insb(unsigned int port,unsigned char * addr,unsigned long count)105 sanei_insb (unsigned int port, unsigned char *addr, unsigned long count)
106 {
107 insb (port, addr, count);
108 }
109
110 void
sanei_insl(unsigned int port,unsigned char * addr,unsigned long count)111 sanei_insl (unsigned int port, unsigned char *addr, unsigned long count)
112 {
113 insl (port, addr, count);
114 }
115
116 void
sanei_outsb(unsigned int port,const unsigned char * addr,unsigned long count)117 sanei_outsb (unsigned int port, const unsigned char *addr,
118 unsigned long count)
119 {
120 outsb (port, addr, count);
121 }
122
123 void
sanei_outsl(unsigned int port,const unsigned char * addr,unsigned long count)124 sanei_outsl (unsigned int port, const unsigned char *addr,
125 unsigned long count)
126 {
127 outsl (port, addr, count);
128 }
129 #endif /* FreeBSD case */
130
131
132 /* linux GCC on i386 */
133 #if ( TEST_SANE_INB(3) ) /* FreeBSD case */
134
135 int
sanei_ioperm(int start,int length,int enable)136 sanei_ioperm (int start, int length, int enable)
137 {
138 #ifdef HAVE_IOPERM
139 return ioperm (start, length, enable);
140 #else
141 /* linux without ioperm ? hum ... */
142 /* makes compilers happy */
143 start = length + enable;
144 return 0;
145 #endif
146 }
147
148 unsigned char
sanei_inb(unsigned int port)149 sanei_inb (unsigned int port)
150 {
151 return inb (port);
152 }
153
154 void
sanei_outb(unsigned int port,unsigned char value)155 sanei_outb (unsigned int port, unsigned char value)
156 {
157 outb (value, port);
158 }
159
160 void
sanei_insb(unsigned int port,unsigned char * addr,unsigned long count)161 sanei_insb (unsigned int port, unsigned char *addr, unsigned long count)
162 {
163 insb (port, addr, count);
164 }
165
166 void
sanei_insl(unsigned int port,unsigned char * addr,unsigned long count)167 sanei_insl (unsigned int port, unsigned char *addr, unsigned long count)
168 {
169 insl (port, addr, count);
170 }
171
172 void
sanei_outsb(unsigned int port,const unsigned char * addr,unsigned long count)173 sanei_outsb (unsigned int port, const unsigned char *addr,
174 unsigned long count)
175 {
176 outsb (port, addr, count);
177 }
178
179 void
sanei_outsl(unsigned int port,const unsigned char * addr,unsigned long count)180 sanei_outsl (unsigned int port, const unsigned char *addr,
181 unsigned long count)
182 {
183 /* oddly, 32 bit I/O are done with outsw instead of the expected outsl */
184 outsw (port, addr, count);
185 }
186 #endif /* linux GCC on i386 */
187
188
189 /* linux GCC non i386 */
190 #if ( TEST_SANE_INB(4) )
191 int
sanei_ioperm(int start,int length,int enable)192 sanei_ioperm (int start, int length, int enable)
193 {
194 #ifdef HAVE_IOPERM
195 return ioperm (start, length, enable);
196 #else
197 /* linux without ioperm ? hum ... */
198 /* makes compilers happy */
199 start = length + enable;
200 return 0;
201 #endif
202 }
203
204 unsigned char
sanei_inb(unsigned int port)205 sanei_inb (unsigned int port)
206 {
207 return inb (port);
208 }
209
210 void
sanei_outb(unsigned int port,unsigned char value)211 sanei_outb (unsigned int port, unsigned char value)
212 {
213 outb (value, port);
214 }
215
216 void
sanei_insb(unsigned int port,unsigned char * addr,unsigned long count)217 sanei_insb (unsigned int port, unsigned char *addr, unsigned long count)
218 {
219 unsigned int i;
220
221 for (i = 0; i < count; i++)
222 addr[i] = sanei_inb (port);
223 }
224
225 void
sanei_insl(unsigned int port,unsigned char * addr,unsigned long count)226 sanei_insl (unsigned int port, unsigned char *addr, unsigned long count)
227 {
228 unsigned int i;
229
230 for (i = 0; i < count * 4; i++)
231 addr[i] = sanei_inb (port);
232 }
233
234 void
sanei_outsb(unsigned int port,const unsigned char * addr,unsigned long count)235 sanei_outsb (unsigned int port, const unsigned char *addr,
236 unsigned long count)
237 {
238 unsigned int i;
239
240 for (i = 0; i < count; i++)
241 sanei_outb (port, addr[i]);
242 }
243
244 void
sanei_outsl(unsigned int port,const unsigned char * addr,unsigned long count)245 sanei_outsl (unsigned int port, const unsigned char *addr,
246 unsigned long count)
247 {
248 unsigned int i;
249
250 for (i = 0; i < count * 4; i++)
251 sanei_outb (port, addr[i]);
252 }
253 #endif /* linux GCC non i386 */
254
255
256 /* ICC on i386 */
257 #if ( TEST_SANE_INB(5) )
258 int
sanei_ioperm(int start,int length,int enable)259 sanei_ioperm (int start, int length, int enable)
260 {
261 #ifdef HAVE_IOPERM
262 return ioperm (start, length, enable);
263 #else
264 /* ICC without ioperm() ... */
265 /* makes compilers happy */
266 start = length + enable;
267 return 0;
268 #endif
269 }
270 unsigned char
sanei_inb(unsigned int port)271 sanei_inb (unsigned int port)
272 {
273 unsigned char ret;
274
275 __asm__ __volatile__ ("inb %%dx,%%al":"=a" (ret):"d" ((u_int) port));
276 return ret;
277 }
278
279 void
sanei_outb(unsigned int port,unsigned char value)280 sanei_outb (unsigned int port, unsigned char value)
281 {
282 __asm__ __volatile__ ("outb %%al,%%dx"::"a" (value), "d" ((u_int) port));
283 }
284
285 void
sanei_insb(unsigned int port,void * addr,unsigned long count)286 sanei_insb (unsigned int port, void *addr, unsigned long count)
287 {
288 __asm__ __volatile__ ("rep ; insb":"=D" (addr), "=c" (count):"d" (port),
289 "0" (addr), "1" (count));
290 }
291
292 void
sanei_insl(unsigned int port,void * addr,unsigned long count)293 sanei_insl (unsigned int port, void *addr, unsigned long count)
294 {
295 __asm__ __volatile__ ("rep ; insl":"=D" (addr), "=c" (count):"d" (port),
296 "0" (addr), "1" (count));
297 }
298
299 void
sanei_outsb(unsigned int port,const void * addr,unsigned long count)300 sanei_outsb (unsigned int port, const void *addr, unsigned long count)
301 {
302 __asm__ __volatile__ ("rep ; outsb":"=S" (addr), "=c" (count):"d" (port),
303 "0" (addr), "1" (count));
304 }
305
306 void
sanei_outsl(unsigned int port,const void * addr,unsigned long count)307 sanei_outsl (unsigned int port, const void *addr, unsigned long count)
308 {
309 __asm__ __volatile__ ("rep ; outsl":"=S" (addr), "=c" (count):"d" (port),
310 "0" (addr), "1" (count));
311 }
312
313 #endif /* ICC on i386 */
314
315 #endif /* ENABLE_PARPORT_DIRECTIO */
316 /*
317 * no inb/outb without --enable-parport-directio *
318 */
319 #ifndef ENABLE_PARPORT_DIRECTIO
320 int
sanei_ioperm(__sane_unused__ int start,__sane_unused__ int length,__sane_unused__ int enable)321 sanei_ioperm (__sane_unused__ int start, __sane_unused__ int length,
322 __sane_unused__ int enable)
323 {
324 /* returns failure */
325 return -1;
326 }
327
328 unsigned char
sanei_inb(__sane_unused__ unsigned int port)329 sanei_inb (__sane_unused__ unsigned int port)
330 {
331 return 255;
332 }
333
334 void
sanei_outb(__sane_unused__ unsigned int port,__sane_unused__ unsigned char value)335 sanei_outb (__sane_unused__ unsigned int port,
336 __sane_unused__ unsigned char value)
337 {
338 }
339
340 void
sanei_insb(__sane_unused__ unsigned int port,__sane_unused__ unsigned char * addr,__sane_unused__ unsigned long count)341 sanei_insb (__sane_unused__ unsigned int port,
342 __sane_unused__ unsigned char *addr,
343 __sane_unused__ unsigned long count)
344 {
345 }
346
347 void
sanei_insl(__sane_unused__ unsigned int port,__sane_unused__ unsigned char * addr,__sane_unused__ unsigned long count)348 sanei_insl (__sane_unused__ unsigned int port,
349 __sane_unused__ unsigned char *addr,
350 __sane_unused__ unsigned long count)
351 {
352 }
353
354 void
sanei_outsb(__sane_unused__ unsigned int port,__sane_unused__ const unsigned char * addr,__sane_unused__ unsigned long count)355 sanei_outsb (__sane_unused__ unsigned int port,
356 __sane_unused__ const unsigned char *addr,
357 __sane_unused__ unsigned long count)
358 {
359 }
360
361 void
sanei_outsl(__sane_unused__ unsigned int port,__sane_unused__ const unsigned char * addr,__sane_unused__ unsigned long count)362 sanei_outsl (__sane_unused__ unsigned int port,
363 __sane_unused__ const unsigned char *addr,
364 __sane_unused__ unsigned long count)
365 {
366 }
367 #endif /* ENABLE_PARPORT_DIRECTIO is not defined */
368