1 /*
2  * Copyright (C) 1995 Advanced RISC Machines Limited. All rights reserved.
3  *
4  * This software may be freely used, copied, modified, and distributed
5  * provided that the above copyright notice is preserved in all copies of the
6  * software.
7  */
8 
9 /* -*-C-*-
10  *
11  * $Revision: 1.3 $
12  *     $Date: 2004/12/27 14:00:54 $
13  *
14  *
15  *   Project: ANGEL
16  *
17  *     Title: Public client interface to devices
18  */
19 
20 #ifndef angel_devclnt_h
21 #define angel_devclnt_h
22 
23 /*
24  * This header exports the public interface to Angel-compliant device
25  * drivers.
26  *
27  * They are intended to be used solely by Angel, not by the User
28  * Application.  See devappl.h for the User Application interface to
29  * the device drivers.
30  */
31 
32 #include "devices.h"
33 
34 /* General purpose constants, macros, enums, typedefs */
35 
36 /*
37  * possible channels at device level
38  *
39  * XXX
40  *
41  * these are used as array indices, so be specific about their values
42  */
43 typedef enum DevChanID {
44   DC_DBUG = 0,                  /* reliable debug packets
45                                  * containing SDBG, CLIB,UDBG, etc.) */
46   DC_APPL = 1,                  /* application packets */
47   DC_NUM_CHANNELS
48 } DevChanID;
49 
50 /* Publically-accessible globals */
51 /* none */
52 
53 /* Public functions */
54 
55 /*
56  * Function: angel_DeviceWrite
57  *  Purpose: The main entry point for asynchronous writes to a device.
58  *
59  *   Params:
60  *              Input: devID     index of the device to write to
61  *                     buff      data to write
62  *                     length    how much data to write
63  *                     callback  callback here when write finished
64  *                                or error
65  *                     cb_data   data to be passed to callback
66  *                     chanID    device channel to use
67  *             Output: -
68  *             In/Out: -
69  *
70  *            Returns: DE_OKAY     write request is underway
71  *                     DE_NO_DEV   no such device
72  *                     DE_BAD_DEV  device does not support angel writes
73  *                     DE_BAD_CHAN no such device channel
74  *                     DE_BUSY     device busy with another write
75  *                     DE_INVAL    silly length
76  *
77  *      Reads globals: -
78  *   Modifies globals: -
79  *
80  * Other side effects: -
81  *
82  * Commence asynchronous transmission of a buffer on a device.  The
83  * callback will occur when the write completes or if there is an
84  * error.
85  *
86  * This must be called for each packet to be sent.
87  */
88 
89 DevError angel_DeviceWrite(DeviceID devID, p_Buffer buff,
90                            unsigned length, DevWrite_CB_Fn callback,
91                            void *cb_data, DevChanID chanID);
92 
93 
94 /*
95  * Function: angel_DeviceRegisterRead
96  *  Purpose: The main entry point for asynchronous reads from a device.
97  *
98  *   Params:
99  *              Input: devID     index of the device to read from
100  *                     callback  callback here when read finished
101  *                                or error
102  *                     cb_data   data to be passed to callback
103  *                     get_buff  callback to be used to acquire buffer
104  *                                for incoming packets
105  *                     getb_data data to be passed to get_buff
106  *                     chanID    device channel to use
107  *             Output: -
108  *             In/Out: -
109  *
110  *            Returns: DE_OKAY     read request is underway
111  *                     DE_NO_DEV   no such device
112  *                     DE_BAD_DEV  device does not support angel reads
113  *                     DE_BAD_CHAN no such device channel
114  *                     DE_BUSY     device busy with another read
115  *                     DE_INVAL    silly length
116  *
117  *      Reads globals: -
118  *   Modifies globals: -
119  *
120  * Other side effects: -
121  *
122  * Register asynchronous packet read from a device.  The callback will
123  * occur when the read completes or if there is an error.
124  *
125  * This is persistent: the read remains registered for all incoming
126  * packets on the device channel.
127  */
128 
129 DevError angel_DeviceRegisterRead(DeviceID devID,
130                                   DevRead_CB_Fn callback, void *cb_data,
131                                   DevGetBuff_Fn get_buff, void *getb_data,
132                                   DevChanID chanID);
133 
134 
135 /*
136  * Function: angel_DeviceControl
137  *  Purpose: Call a control function for a device
138  *
139  *   Params:
140  *              Input: devID     index of the device to control to
141  *                     op        operation to perform
142  *                     arg       parameter depending on op
143  *
144  *            Returns: DE_OKAY     control request is underway
145  *                     DE_NO_DEV   no such device
146  *                     DE_BAD_OP   device does not support operation
147  *
148  *      Reads globals: -
149  *   Modifies globals: -
150  *
151  * Other side effects: -
152  *
153  * Have a device perform a control operation.  Extra parameters vary
154  * according to the operation requested.
155  */
156 
157 DevError angel_DeviceControl(DeviceID devID, DeviceControl op, void *arg);
158 
159 
160 /*
161  * Function: angel_ReceiveMode
162  *  Purpose: enable or disable reception across all devices
163  *
164  *   Params:
165  *              Input: mode   choose enable or disable
166  *
167  * Pass the mode parameter to the receive_mode control method of each device
168  */
169 
170 void angel_ReceiveMode(DevRecvMode mode);
171 
172 
173 /*
174  * Function: angel_ResetDevices
175  *  Purpose: reset all devices
176  *
177  *   Params: none
178  *
179  * Call the reset control method for each device
180  */
181 
182 void angel_ResetDevices(void);
183 
184 
185 /*
186  * Function: angel_InitialiseDevices
187  *  Purpose: initialise the device driver layer
188  *
189  *   Params: none
190  *
191  * Set up the device driver layer and call the init method for each device
192  */
193 
194 void angel_InitialiseDevices(void);
195 
196 
197 /*
198  * Function: angel_IsAngelDevice
199  *  Purpose: Find out if a device supports Angel packets
200  *
201  *   Params:
202  *              Input: devID     index of the device to control to
203  *
204  *            Returns: TRUE      supports Angel packets
205  *                     FALSE     raw device
206  *
207  *      Reads globals: -
208  *   Modifies globals: -
209  *
210  * Other side effects: -
211  */
212 
213 bool angel_IsAngelDevice(DeviceID devID);
214 
215 
216 #if !defined(MINIMAL_ANGEL) || MINIMAL_ANGEL == 0
217 
218 /*
219  * Function: angel_ApplDeviceHandler
220  *  Purpose: The entry point for User Application Device Driver requests
221  *           in a full functiionality version of Angel.
222  *           It will never be called directly by the User Application,
223  *           but gets called indirectly, via the SWI handler.
224  *
225  *  Params:
226  *      Input: swi_r0    Argument to SWI indicating that
227  *                       angel_ApplDeviceHandler was to be called.  This
228  *                       will not be used in this function, but is needed
229  *                       by the SWI handler.
230  *             arg_blk   pointer to block of arguments
231  *                       arg_blk[0] is one of
232  *                       angel_SWIreason_ApplDevice_{Read,Write,Yield}
233  *                       which indicates which angel_Device* fn is to
234  *                       be called.  arg_blk[1] - arg_blk[n] are the
235  *                       arguments to the corresponding
236  *                       angel_ApplDevice* function.
237  *             Output: -
238  *             In/Out: -
239  *
240  *            Returns:   whatever the specified angel_Device* function
241  *                       returns.
242  *
243  *      Reads globals: -
244  *   Modifies globals: -
245  *
246  * Other side effects: -
247  *
248  * This has the side effects of angel_Device{Read,Write,Yield}
249  * depending upon which is operation is specified as described above.
250  */
251 
252 DevError angel_ApplDeviceHandler(
253   unsigned swi_r0, unsigned *arg_blk
254 );
255 
256 #endif /* ndef MINIMAL_ANGEL */
257 
258 #endif /* ndef angel_devclnt_h */
259 
260 /* EOF devclnt.h */
261