1 /*
2  *   Creation Date: <2002/06/16 01:40:57 samuel>
3  *   Time-stamp: <2003/12/26 17:02:09 samuel>
4  *
5  *	<osi_calls.h>
6  *
7  *	OSI call inlines
8  *
9  *   Copyright (C) 2002, 2003 Samuel Rydh (samuel@ibrium.se)
10  *
11  *   This program is free software; you can redistribute it and/or
12  *   modify it under the terms of the GNU General Public License
13  *   as published by the Free Software Foundation
14  *
15  */
16 
17 #ifndef _H_OSI_CALLS
18 #define _H_OSI_CALLS
19 
20 #include "osi.h"
21 
22 /* Old gcc versions have a limit on the number of registers used.
23  * Newer gcc versions (gcc 3.3) require that the clobber list does
24  * not overlap declared registers.
25  */
26 #if __GNUC__ == 2 || ( __GNUC__ == 3 && __GNUC_MINOR__ < 3 )
27 #define SHORT_REGLIST
28 #endif
29 
30 
31 /************************************************************************/
32 /*	OSI call instantiation macros					*/
33 /************************************************************************/
34 
35 #define dreg(n)			__oc_##n __asm__ (#n)
36 #define ir(n)			"r" (__oc_##n)
37 #define rr(n)			"=r" (__oc_##n)
38 
39 #define _oc_head( input_regs... )				\
40 {								\
41 	int _ret=0;						\
42 	{							\
43 		register unsigned long dreg(r3);		\
44 		register unsigned long dreg(r4);		\
45 		register unsigned long dreg(r5)			\
46 			,##input_regs ;
47 
48 #define _oc_syscall( number, extra_ret_regs... )		\
49 		__oc_r3 = OSI_SC_MAGIC_R3;			\
50 		__oc_r4 = OSI_SC_MAGIC_R4;			\
51 		__oc_r5 = number;				\
52 		__asm__ __volatile__ (				\
53 		  "sc	" : rr(r3) ,## extra_ret_regs
54 
55 #define _oc_input( regs... )					\
56 		: ir(r3), ir(r4), ir(r5)			\
57 		, ## regs					\
58 		: "memory" );
59 
60 /* the tail memory clobber is necessary since we violate the strict
61  * aliasing rules when we return structs through the registers.
62  */
63 #define _oc_tail						\
64 		asm volatile ( "" : : : "memory" );		\
65 		_ret = __oc_r3;					\
66 	}							\
67 	return _ret;						\
68 }
69 
70 
71 /************************************************************************/
72 /*	Alternatives 							*/
73 /************************************************************************/
74 
75 #ifdef SHORT_REGLIST
76 #define _oc_syscall_r10w6( number, inputregs... )		\
77 		__oc_r3 = OSI_SC_MAGIC_R3;			\
78 		__oc_r4 = OSI_SC_MAGIC_R4;			\
79 		__oc_r5 = number;				\
80 		__asm__ __volatile__ (				\
81 		  "sc			\n"			\
82 		  "stw	4,0(10) 	\n"			\
83 		  "stw	5,4(10) 	\n"			\
84 		  "stw	6,8(10) 	\n"			\
85 		  "stw	7,12(10) 	\n"			\
86 		  "stw	8,16(10) 	\n"			\
87 		  "stw	9,20(10) 	\n"			\
88 		: rr(r3)					\
89 		: ir(r3), ir(r4), ir(r5), ir(r10) 		\
90 		  ,## inputregs 				\
91 		: "memory",					\
92 		   "r4", "r5", "r6", "r7", "r8", "r9" );
93 #endif
94 
95 
96 /************************************************************************/
97 /*	Common helper functions						*/
98 /************************************************************************/
99 
100 #define _osi_call0( type, name, number ) 			\
101 type name( void ) 						\
102 	_oc_head()						\
103 	_oc_syscall( number )					\
104 	_oc_input()						\
105 	_oc_tail
106 
107 #define _osi_call1( type, name, number, type1, arg1 ) 		\
108 type name( type1 arg1 ) 					\
109 	_oc_head( dreg(r6) )					\
110 	__oc_r6 = (unsigned long)arg1;				\
111 	_oc_syscall( number )					\
112 	_oc_input( ir(r6) )					\
113 	_oc_tail
114 
115 #define _osi_call2( type, name, number, t1, a1, t2, a2 ) 	\
116 type name( t1 a1, t2 a2 ) 					\
117 	_oc_head( dreg(r6), dreg(r7) )				\
118 	__oc_r6 = (unsigned long)a1;				\
119 	__oc_r7 = (unsigned long)a2;				\
120 	_oc_syscall( number )					\
121 	_oc_input( ir(r6), ir(r7) )				\
122 	_oc_tail
123 
124 #define _osi_call3( type, name, number, t1, a1, t2, a2, t3, a3 ) \
125 type name( t1 a1, t2 a2, t3 a3 ) 				\
126 	_oc_head( dreg(r6), dreg(r7), dreg(r8) )		\
127 	__oc_r6 = (unsigned long)a1;				\
128 	__oc_r7 = (unsigned long)a2;				\
129 	__oc_r8 = (unsigned long)a3;				\
130 	_oc_syscall( number )					\
131 	_oc_input( ir(r6), ir(r7), ir(r8) )			\
132 	_oc_tail
133 
134 #define _osi_call4( type, name, number, t1, a1, t2, a2, t3, a3, t4, a4 ) \
135 type name( t1 a1, t2 a2, t3 a3, t4 a4 ) 			\
136 	_oc_head( dreg(r6), dreg(r7), dreg(r8), dreg(r9) )	\
137 	__oc_r6 = (unsigned long)a1;				\
138 	__oc_r7 = (unsigned long)a2;				\
139 	__oc_r8 = (unsigned long)a3;				\
140 	__oc_r9 = (unsigned long)a4;				\
141 	_oc_syscall( number )					\
142 	_oc_input( ir(r6), ir(r7), ir(r8), ir(r9) )		\
143 	_oc_tail
144 
145 #define _osi_call5( type, name, number, t1, a1, t2, a2, t3, a3, t4, a4, t5, a5 ) \
146 type name( t1 a1, t2 a2, t3 a3, t4 a4, t5 a5 ) 				\
147 	_oc_head( dreg(r6), dreg(r7), dreg(r8), dreg(r9), dreg(r10) )	\
148 	__oc_r6 = (unsigned long)a1;					\
149 	__oc_r7 = (unsigned long)a2;					\
150 	__oc_r8 = (unsigned long)a3;					\
151 	__oc_r9 = (unsigned long)a4;					\
152 	__oc_r10 = (unsigned long)a5;					\
153 	_oc_syscall( number )						\
154 	_oc_input( ir(r6), ir(r7), ir(r8), ir(r9), ir(r10) )		\
155 	_oc_tail
156 
157 #define _osi_call6( type, name, number, t1, a1, t2, a2, t3, a3, t4, a4, t5, a5, t6, a6 ) \
158 type name( t1 a1, t2 a2, t3 a3, t4 a4, t5 a5, t6 a6 ) 				\
159 	_oc_head( dreg(r6), dreg(r7), dreg(r8), dreg(r9), dreg(r10), dreg(r11) )\
160 	__oc_r6 = (unsigned long)a1;					\
161 	__oc_r7 = (unsigned long)a2;					\
162 	__oc_r8 = (unsigned long)a3;					\
163 	__oc_r9 = (unsigned long)a4;					\
164 	__oc_r10 = (unsigned long)a5;					\
165 	__oc_r11 = (unsigned long)a6;					\
166 	_oc_syscall( number )						\
167 	_oc_input( ir(r6), ir(r7), ir(r8), ir(r9), ir(r10), ir(r11) )	\
168 	_oc_tail
169 
170 
171 /************************************************************************/
172 /*	Special 							*/
173 /************************************************************************/
174 
175 /* r4 returned in retarg1 pointer */
176 #define _osi_call0_w1( type, name, number, type1, retarg1 ) 	\
177 type name( type1 retarg1 ) 					\
178 	_oc_head()						\
179 	_oc_syscall( number, rr(r4) )				\
180 	_oc_input()						\
181 	*retarg1 = __oc_r4;					\
182 	_oc_tail
183 
184 #define _osi_call0_w2( type, name, number, type1, retarg1 ) 	\
185 type name( type1 retarg1 ) 					\
186 	_oc_head()						\
187 	_oc_syscall( number, rr(r4), rr(r5) )			\
188 	_oc_input()						\
189 	((unsigned long*)retarg1)[0] = __oc_r4;			\
190 	((unsigned long*)retarg1)[1] = __oc_r5;			\
191 	_oc_tail
192 
193 /* r4-r8 returned in retarg1 pointer */
194 #define _osi_call0_w5( type, name, number, type1, retarg1 ) 	\
195 type name( type1 retarg1 ) 					\
196 	_oc_head( dreg(r6), dreg(r7), dreg(r8) )		\
197 	_oc_syscall( number, 					\
198 		rr(r4), rr(r5), rr(r6), rr(r7), rr(r8) )	\
199 	_oc_input()						\
200 	((unsigned long*)retarg1)[0] = __oc_r4;			\
201 	((unsigned long*)retarg1)[1] = __oc_r5;			\
202 	((unsigned long*)retarg1)[2] = __oc_r6;			\
203 	((unsigned long*)retarg1)[3] = __oc_r7;			\
204 	((unsigned long*)retarg1)[4] = __oc_r8;			\
205 	_oc_tail
206 
207 /* r4 returned in retarg pointer */
208 #define _osi_call1_w1( type, name, number, t1, a1, t2, retarg ) \
209 type name( t1 a1, t2 retarg ) 					\
210 	_oc_head( dreg(r6) )					\
211 	__oc_r6 = (unsigned long)a1;				\
212 	_oc_syscall( number, rr(r4) )				\
213 	_oc_input( ir(r6) )					\
214 	((unsigned long*)retarg)[0] = __oc_r4;			\
215 	_oc_tail
216 
217 /* r4,r5 returned in retarg1, retarg2 */
218 #define _osi_call1_w1w1( type, name, number, t1, a1, t2, retarg1, t3, retarg2 ) \
219 type name( t1 a1, t2 retarg1, t3 retarg2 )			\
220 	_oc_head( dreg(r6) )					\
221 	__oc_r6 = (unsigned long)a1;				\
222 	_oc_syscall( number, rr(r4), rr(r5) )			\
223 	_oc_input( ir(r6) )					\
224 	((unsigned long*)retarg1)[0] = __oc_r4;			\
225 	((unsigned long*)retarg2)[0] = __oc_r5;			\
226 	_oc_tail
227 
228 /* r4,r5 returned in retarg1, retarg2, retarg3 */
229 #define _osi_call1_w1w1w1( type, name, number, t1, a1, t2, retarg1, t3, retarg2, t4, retarg3 ) \
230 type name( t1 a1, t2 retarg1, t3 retarg2, t4 retarg3 )		\
231 	_oc_head( dreg(r6) )					\
232 	__oc_r6 = (unsigned long)a1;				\
233 	_oc_syscall( number, rr(r4), rr(r5), rr(r6) )		\
234 	_oc_input( ir(r6) )					\
235 	((unsigned long*)retarg1)[0] = __oc_r4;			\
236 	((unsigned long*)retarg2)[0] = __oc_r5;			\
237 	((unsigned long*)retarg3)[0] = __oc_r6;			\
238 	_oc_tail
239 
240 /* r4,r5 returned in retarg pointer */
241 #define _osi_call1_w2( type, name, number, t1, a1, t2, retarg ) \
242 type name( t1 a1, t2 retarg ) 					\
243 	_oc_head( dreg(r6) )					\
244 	__oc_r6 = (unsigned long)a1;				\
245 	_oc_syscall( number, rr(r4), rr(r5) )			\
246 	_oc_input( ir(r6) )					\
247 	((unsigned long*)retarg)[0] = __oc_r4;			\
248 	((unsigned long*)retarg)[1] = __oc_r5;			\
249 	_oc_tail
250 
251 /* r4-r7 returned in retarg pointer */
252 #define _osi_call1_w4( type, name, number, t1, a1, t2, retarg ) \
253 type name( t1 a1, t2 retarg )					\
254 	_oc_head( dreg(r6), dreg(r7) )				\
255 	__oc_r6 = (unsigned long)a1;				\
256 	_oc_syscall( number, rr(r4), rr(r5), rr(r6), rr(r7) )	\
257 	_oc_input( ir(r6) )					\
258 	((unsigned long*)retarg)[0] = __oc_r4;			\
259 	((unsigned long*)retarg)[1] = __oc_r5;			\
260 	((unsigned long*)retarg)[2] = __oc_r6;			\
261 	((unsigned long*)retarg)[3] = __oc_r7;			\
262 	_oc_tail
263 
264 
265 /* r4-r5 returned in retarg pointer */
266 #define _osi_call2_w2( type, name, number, t1, a1, t2, a2, t3, retarg ) \
267 type name( t1 a1, t2 a2, t3 retarg ) 				\
268 	_oc_head( dreg(r6), dreg(r7) )				\
269 	__oc_r6 = (unsigned long)a1;				\
270 	__oc_r7 = (unsigned long)a2;				\
271 	_oc_syscall( number, rr(r4), rr(r5) )			\
272 	_oc_input( ir(r6), ir(r7) )				\
273 	((unsigned long*)retarg)[0] = __oc_r4;			\
274 	((unsigned long*)retarg)[1] = __oc_r5;			\
275 	_oc_tail
276 
277 /* r4-r7 returned in retarg pointer */
278 #define _osi_call2_w4( type, name, number, t1, a1, t2, a2, t3, retarg ) \
279 type name( t1 a1, t2 a2, t3 retarg ) 				\
280 	_oc_head( dreg(r6), dreg(r7) )				\
281 	__oc_r6 = (unsigned long)a1;				\
282 	__oc_r7 = (unsigned long)a2;				\
283 	_oc_syscall( number, rr(r4), rr(r5), rr(r6), rr(r7) )	\
284 	_oc_input( ir(r6), ir(r7) )				\
285 	((unsigned long*)retarg)[0] = __oc_r4;			\
286 	((unsigned long*)retarg)[1] = __oc_r5;			\
287 	((unsigned long*)retarg)[2] = __oc_r6;			\
288 	((unsigned long*)retarg)[3] = __oc_r7;			\
289 	_oc_tail
290 
291 #ifdef SHORT_REGLIST
292 /* r4-r9 returned in retarg pointer */
293 #define _osi_call2_w6( type, name, number, t1, a1, t2, a2, t3, retarg ) \
294 type name( t1 a1, t2 a2, t3 retarg ) 				\
295 	_oc_head( dreg(r6), dreg(r7), dreg(r10) )		\
296         __oc_r6 = (unsigned long)a1;				\
297         __oc_r7 = (unsigned long)a2;				\
298 	__oc_r10 = (unsigned long)retarg;			\
299 	_oc_syscall_r10w6( number, ir(r6), ir(r7) )		\
300 	_oc_tail
301 
302 #else /* SHORT_REGLIST */
303 
304 /* r4-r9 returned in retarg pointer */
305 #define _osi_call2_w6( type, name, number, t1, a1, t2, a2, t3, retarg ) \
306 type name( t1 a1, t2 a2, t3 retarg ) 				\
307 	_oc_head( dreg(r6), dreg(r7), dreg(r8), dreg(r9) )	\
308 	__oc_r6 = (unsigned long)a1;				\
309 	__oc_r7 = (unsigned long)a2;				\
310 	_oc_syscall( number, rr(r4), rr(r5), rr(r6), rr(r7), rr(r8), rr(r9) )	\
311 	_oc_input( ir(r6), ir(r7) )				\
312 	((unsigned long*)retarg)[0] = __oc_r4;			\
313 	((unsigned long*)retarg)[1] = __oc_r5;			\
314 	((unsigned long*)retarg)[2] = __oc_r6;			\
315 	((unsigned long*)retarg)[3] = __oc_r7;			\
316 	((unsigned long*)retarg)[4] = __oc_r8;			\
317 	((unsigned long*)retarg)[5] = __oc_r9;			\
318 	_oc_tail
319 
320 #endif /* SHORT_REGLIST */
321 
322 
323 /************************************************************************/
324 /*	OSI call inlines						*/
325 /************************************************************************/
326 
327 static inline _osi_call1( int, OSI_CallAvailable, OSI_CALL_AVAILABLE, int, osi_num );
328 
329 static inline _osi_call1( int, OSI_PutC, OSI_LOG_PUTC, int, ch );
330 
331 static inline _osi_call1( int, OSI_Debugger, OSI_DEBUGGER, int, num );
332 static inline _osi_call0( int, OSI_Exit, OSI_EXIT );
333 
334 /* misc */
335 static inline _osi_call0( unsigned long, OSI_GetLocalTime, OSI_GET_LOCALTIME );
336 static inline _osi_call0( unsigned long, OSI_GetGMTTime, OSI_GET_GMT_TIME );
337 static inline _osi_call1( int, OSI_USleep, OSI_USLEEP, int, usecs );
338 
339 /* NVRAM */
340 static inline _osi_call0( int, OSI_NVRamSize, OSI_NVRAM_SIZE );
341 static inline _osi_call1( int, OSI_ReadNVRamByte, OSI_READ_NVRAM_BYTE, int, offs );
342 static inline _osi_call2( int, OSI_WriteNVRamByte, OSI_WRITE_NVRAM_BYTE, int, offs,
343 			  unsigned char, ch );
344 
345 /* keyboard stuff */
346 static inline _osi_call0_w1( int, OSI_GetAdbKey2, OSI_GET_ADB_KEY, int *, raw_key );
347 static inline _osi_call1( int, OSI_KbdCntrl, OSI_KBD_CNTRL, int, cmd );
348 
OSI_GetAdbKey(void)349 static inline int OSI_GetAdbKey( void )
350 	{ int dummy_raw_key; return OSI_GetAdbKey2( &dummy_raw_key ); }
351 static inline _osi_call2( int, OSI_MapAdbKey, OSI_MAP_ADB_KEY, int, keycode, int, adbkey )
352 static inline _osi_call1( int, OSI_KeycodeToAdb, OSI_KEYCODE_TO_ADB, int, keycode );
353 static inline _osi_call0( int, OSI_SaveKeymapping, OSI_SAVE_KEYMAPPING );
354 
355 /* mouse support */
356 struct osi_mouse;
357 static inline _osi_call0_w5( int, OSI_GetMouse, OSI_GET_MOUSE, struct osi_mouse *, ret );
358 static inline _osi_call0( int, OSI_GetMouseDPI, OSI_GET_MOUSE_DPI );
359 
360 /* video */
361 static inline _osi_call2( int, OSI_SetVMode_, OSI_SET_VMODE, int, mode, int, depth_mode );
362 struct osi_get_vmode_info;
363 static inline _osi_call2_w6( int, OSI_GetVModeInfo_, OSI_GET_VMODE_INFO, int, mode, int, depth_mode,
364 			     struct osi_get_vmode_info *, ret );
365 static inline _osi_call1( int, OSI_SetVPowerState, OSI_SET_VIDEO_POWER, int, power_state );
366 static inline _osi_call2( int, OSI_SetColor, OSI_SET_COLOR, int, index, int, rgb );
367 static inline _osi_call0_w1( int, OSI_VideoAckIRQ, OSI_VIDEO_ACK_IRQ, int *, events );
368 
OSI_RefreshPalette(void)369 static inline void OSI_RefreshPalette( void ) { OSI_SetColor(-1,0); }
370 
371 /* PIC (mac-io replacement) */
372 static inline _osi_call1( int, OSI_PICMaskIRQ, OSI_PIC_MASK_IRQ, int, irq );
373 static inline _osi_call1( int, OSI_PICUnmaskIRQ, OSI_PIC_UNMASK_IRQ, int, irq );
374 static inline _osi_call2( int, OSI_PICAckIRQ, OSI_PIC_ACK_IRQ, int, irq, int, mask_it );
375 static inline _osi_call0( int, OSI_PICGetActiveIRQ, OSI_PIC_GET_ACTIVE_IRQ );
376 
377 /* sound */
378 static inline _osi_call1( int, OSI_SoundCntl, OSI_SOUND_CNTL, int, cmd );
379 static inline _osi_call2( int, OSI_SoundCntl1, OSI_SOUND_CNTL, int, cmd, int, p1 );
380 static inline _osi_call3( int, OSI_SoundCntl2, OSI_SOUND_CNTL, int, cmd, int, p1, int, p2 );
381 static inline _osi_call0_w2( int, OSI_SoundIRQAck, OSI_SOUND_IRQ_ACK, unsigned long *, timestamp );
382 static inline _osi_call3( int, OSI_SoundWrite, OSI_SOUND_WRITE, int, physbuf, int, len, int, restart );
383 static inline _osi_call3( int, OSI_SoundSetVolume, OSI_SOUND_SET_VOLUME, int, hwvol, int, speakervol, int, mute );
384 
385 /* async block driver */
386 struct ablk_disk_info;
387 static inline _osi_call2_w4( int, OSI_ABlkDiskInfo, OSI_ABLK_DISK_INFO, int, channel, int, unit,
388 			     struct ablk_disk_info *, retinfo );
389 static inline _osi_call1( int, OSI_ABlkKick, OSI_ABLK_KICK, int, channel );
390 static inline _osi_call1_w1w1w1( int, OSI_ABlkIRQAck, OSI_ABLK_IRQ_ACK, int, channel, int *, req_count,
391 			       int *, active, int *, events );
392 static inline _osi_call3( int, OSI_ABlkRingSetup, OSI_ABLK_RING_SETUP, int, channel, int, mphys, int, n_el );
393 static inline _osi_call2( int, OSI_ABlkCntrl, OSI_ABLK_CNTRL, int, channel, int, cmd );
394 static inline _osi_call3( int, OSI_ABlkCntrl1, OSI_ABLK_CNTRL, int, channel, int, cmd, int, param );
395 static inline _osi_call5( int, OSI_ABlkSyncRead, OSI_ABLK_SYNC_READ, int, channel, int, unit,
396 			  int, blk, unsigned long, mphys, int, size );
397 static inline _osi_call5( int, OSI_ABlkSyncWrite, OSI_ABLK_SYNC_WRITE, int, channel, int, unit,
398 			  int, blk, unsigned long, mphys, int, size );
399 static inline _osi_call2( int, OSI_ABlkBlessDisk, OSI_ABLK_BLESS_DISK, int, channel, int, unit );
400 
401 static inline _osi_call0( int, OSI_CMountDrvVol, OSI_CMOUNT_DRV_VOL );
402 
403 /* enet2 */
404 static inline _osi_call0( int, OSI_Enet2Open, OSI_ENET2_OPEN );
405 static inline _osi_call0( int, OSI_Enet2Close, OSI_ENET2_CLOSE );
406 static inline _osi_call3( int, OSI_Enet2RingSetup, OSI_ENET2_RING_SETUP, int, which_ring,
407 			  int, ring_mphys, int, n_el );
408 static inline _osi_call2( int, OSI_Enet2Cntrl1, OSI_ENET2_CNTRL, int, cmd, int, param );
409 static inline _osi_call1( int, OSI_Enet2Cntrl, OSI_ENET2_CNTRL, int, cmd );
410 static inline _osi_call0( int, OSI_Enet2Kick, OSI_ENET2_KICK );
411 
412 static inline _osi_call0_w2( int, OSI_Enet2GetHWAddr__, OSI_ENET2_GET_HWADDR, unsigned long *, retbuf );
OSI_Enet2GetHWAddr(unsigned char * addr)413 static inline int OSI_Enet2GetHWAddr( unsigned char *addr ) {
414 	int ret;
415 	unsigned long buf[2];
416 
417 	ret = OSI_Enet2GetHWAddr__( buf );
418 
419 	((unsigned long*)addr)[0] = buf[0];
420 	((unsigned short*)addr)[2] = (buf[1] >> 16);
421 	return ret;
422 }
423 static inline _osi_call2( int, OSI_Enet2IRQAck, OSI_ENET2_IRQ_ACK, int, irq_enable, int, rx_head );
424 
425 /* PROM (device-tree) */
426 static inline _osi_call2( int, OSI_PromIface, OSI_PROM_IFACE, int, what, int, ph );
427 static inline _osi_call3( int, OSI_PromIface1, OSI_PROM_IFACE, int, what, int, ph, int, p1 );
428 static inline _osi_call4( int, OSI_PromIface2, OSI_PROM_IFACE, int, what, int, ph, int, p1, int, p2 );
429 static inline _osi_call5( int, OSI_PromIface3, OSI_PROM_IFACE, int, what, int, ph, int, p1, int, p2, int, p3 );
430 static inline _osi_call2( int, OSI_PromPathIface, OSI_PROM_PATH_IFACE, int, what, const char *, p );
431 
432 /* emulation acceleration */
433 static inline _osi_call1( int, OSI_MapinMregs, OSI_MAPIN_MREGS, unsigned long, mphys );
434 static inline _osi_call3( int, OSI_EmuAccel, OSI_EMUACCEL, int, emuaccel_flags, int, param, int, inst_addr );
435 
436 /* timer frequency */
437 static inline _osi_call1( int, OSI_MticksToUsecs, OSI_MTICKS_TO_USECS, unsigned long, mticks );
438 static inline _osi_call1( int, OSI_UsecsToMticks, OSI_USECS_TO_MTICKS, unsigned long, usecs );
439 
440 /* fb info */
441 struct osi_fb_info;
442 static inline _osi_call0_w5( int, OSI_GetFBInfo, OSI_GET_FB_INFO, struct osi_fb_info *, retinfo );
443 
444 /* SCSI */
445 static inline _osi_call0( int, OSI_SCSIAck, OSI_SCSI_ACK );
446 static inline _osi_call1( int, OSI_SCSISubmit, OSI_SCSI_SUBMIT, int, req_mphys );
447 static inline _osi_call2( int, OSI_SCSIControl, OSI_SCSI_CNTRL, int, sel, int, param );
448 
449 /* TTY */
450 static inline _osi_call0( int, OSI_TTYGetc, OSI_TTY_GETC );
451 static inline _osi_call1( int, OSI_TTYPutc, OSI_TTY_PUTC, int, ch );
452 static inline _osi_call0( int, OSI_TTYIRQAck, OSI_TTY_IRQ_ACK );
453 
454 #endif   /* _H_OSI_CALLS */
455