xref: /openbsd-src/gnu/usr.bin/binutils/gdb/rdi-share/channels.h (revision 63addd46c1e40ca0f49488ddcdc4ab598023b0c1)
1b725ae77Skettenis /*
2b725ae77Skettenis  * Copyright (C) 1995 Advanced RISC Machines Limited. All rights reserved.
3b725ae77Skettenis  *
4b725ae77Skettenis  * This software may be freely used, copied, modified, and distributed
5b725ae77Skettenis  * provided that the above copyright notice is preserved in all copies of the
6b725ae77Skettenis  * software.
7b725ae77Skettenis  */
8b725ae77Skettenis 
9b725ae77Skettenis /* -*-C-*-
10b725ae77Skettenis  *
11*63addd46Skettenis  * $Revision: 1.3 $
12*63addd46Skettenis  *     $Date: 2004/12/27 14:00:54 $
13b725ae77Skettenis  *
14b725ae77Skettenis  *
15b725ae77Skettenis  *   Project: ANGEL
16b725ae77Skettenis  *
17b725ae77Skettenis  *     Title: User interface to the channels layer
18b725ae77Skettenis  */
19b725ae77Skettenis 
20b725ae77Skettenis #ifndef angel_channels_h
21b725ae77Skettenis #define angel_channels_h
22b725ae77Skettenis 
23b725ae77Skettenis /*
24b725ae77Skettenis  * This provides the public interface to the channels layer read and write
25b725ae77Skettenis  * routines, and buffer management routines.
26b725ae77Skettenis  */
27b725ae77Skettenis 
28b725ae77Skettenis /* Nested header files, if required */
29b725ae77Skettenis 
30b725ae77Skettenis #include "devices.h"
31b725ae77Skettenis #include "chandefs.h"
32b725ae77Skettenis #include "adperr.h"
33b725ae77Skettenis 
34b725ae77Skettenis /* General purpose constants, macros, enums, typedefs */
35b725ae77Skettenis 
36b725ae77Skettenis /* use the default device */
37b725ae77Skettenis #define CH_DEFAULT_DEV ((DeviceID)-1)
38b725ae77Skettenis 
39b725ae77Skettenis /* return codes */
40b725ae77Skettenis typedef enum ChanError {
41b725ae77Skettenis   CE_OKAY,                      /* no error */
42b725ae77Skettenis   CE_ABANDONED,                 /* abandoned due to device switch */
43b725ae77Skettenis   CE_DEV_ERROR,                 /* unexpected error from device driver */
44b725ae77Skettenis   CE_BUSY,                      /* channel in use */
45b725ae77Skettenis   CE_BUFF_ERROR,                /* unable to get buffer */
46b725ae77Skettenis   CE_PRIVATE                    /* start of internal error codes */
47b725ae77Skettenis } ChanError;
48b725ae77Skettenis 
49b725ae77Skettenis 
50b725ae77Skettenis /* Publically-accessible globals */
51b725ae77Skettenis 
52b725ae77Skettenis /*
53b725ae77Skettenis  * The following two globals are only valid after angel_InitialiseChannels()
54b725ae77Skettenis  * has been called.
55b725ae77Skettenis  */
56b725ae77Skettenis 
57b725ae77Skettenis /* the default size of a channel buffer, for global use */
58b725ae77Skettenis extern unsigned Angel_ChanBuffSize;
59b725ae77Skettenis 
60b725ae77Skettenis /* the size of a long buffer, for global use */
61b725ae77Skettenis extern unsigned Angel_ChanLongSize;
62b725ae77Skettenis 
63b725ae77Skettenis #ifdef TARGET
64b725ae77Skettenis AdpErrs send_resend_msg(DeviceID devid);
65b725ae77Skettenis #endif
66b725ae77Skettenis 
67b725ae77Skettenis /*
68b725ae77Skettenis  * Function: angel_InitialiseChannels
69b725ae77Skettenis  *  Purpose: initialise the channels layer
70b725ae77Skettenis  *
71b725ae77Skettenis  *   Params:
72b725ae77Skettenis  *              Input: -
73b725ae77Skettenis  *             Output: -
74b725ae77Skettenis  *             In/Out: -
75b725ae77Skettenis  *
76b725ae77Skettenis  *            Returns: -
77b725ae77Skettenis  *
78b725ae77Skettenis  *      Reads globals: -
79b725ae77Skettenis  *   Modifies globals: -
80b725ae77Skettenis  *
81b725ae77Skettenis  * Other side effects: -
82b725ae77Skettenis  */
83b725ae77Skettenis 
84b725ae77Skettenis void angel_InitialiseChannels( void );
85b725ae77Skettenis 
86b725ae77Skettenis /*
87b725ae77Skettenis  * Function: adp_init_seq
88b725ae77Skettenis  *  Purpose: initialise sequence numbers and free anyt leftover buffers
89b725ae77Skettenis  *
90b725ae77Skettenis  *   Params:
91b725ae77Skettenis  *              Input: -
92b725ae77Skettenis  *             Output: -
93b725ae77Skettenis  *             In/Out: -
94b725ae77Skettenis  *
95b725ae77Skettenis  *            Returns: - adp_ok if things went ok else an error code
96b725ae77Skettenis  *
97b725ae77Skettenis  *      Reads globals: -
98b725ae77Skettenis  *   Modifies globals: -
99b725ae77Skettenis  *
100b725ae77Skettenis  * Other side effects: -
101b725ae77Skettenis  */
102b725ae77Skettenis 
103b725ae77Skettenis AdpErrs adp_init_seq(void);
104b725ae77Skettenis 
105b725ae77Skettenis /*
106b725ae77Skettenis  * Function: angel_ChannelAllocBuffer
107b725ae77Skettenis  *  Purpose: allocate a buffer that is at least req_size bytes long
108b725ae77Skettenis  *
109b725ae77Skettenis  *   Params:
110b725ae77Skettenis  *              Input: req_size        the minimum size required
111b725ae77Skettenis  *             Output: -
112b725ae77Skettenis  *             In/Out: -
113b725ae77Skettenis  *
114b725ae77Skettenis  *            Returns: pointer to allocated buffer, or
115b725ae77Skettenis  *                     NULL if unable to allocate suitable buffer
116b725ae77Skettenis  *
117b725ae77Skettenis  *      Reads globals: -
118b725ae77Skettenis  *   Modifies globals: -
119b725ae77Skettenis  *
120b725ae77Skettenis  * Other side effects: -
121b725ae77Skettenis  */
122b725ae77Skettenis 
123b725ae77Skettenis p_Buffer angel_ChannelAllocBuffer(unsigned req_size);
124b725ae77Skettenis 
125b725ae77Skettenis 
126b725ae77Skettenis /*
127b725ae77Skettenis  * Function: angel_ChannelReleaseBuffer
128b725ae77Skettenis  *  Purpose: release a buffer back to the free pool
129b725ae77Skettenis  *
130b725ae77Skettenis  *   Params:
131b725ae77Skettenis  *              Input: buffer   the buffer to release
132b725ae77Skettenis  *             Output: -
133b725ae77Skettenis  *             In/Out: -
134b725ae77Skettenis  *
135b725ae77Skettenis  *            Returns: -
136b725ae77Skettenis  *
137b725ae77Skettenis  *      Reads globals: -
138b725ae77Skettenis  *   Modifies globals: -
139b725ae77Skettenis  *
140b725ae77Skettenis  * Other side effects: -
141b725ae77Skettenis  */
142b725ae77Skettenis 
143b725ae77Skettenis void angel_ChannelReleaseBuffer(p_Buffer buffer);
144b725ae77Skettenis 
145b725ae77Skettenis 
146b725ae77Skettenis /*
147b725ae77Skettenis  * Function: angel_ChannelSend
148b725ae77Skettenis  *  Purpose: blocking send of a packet via a channel
149b725ae77Skettenis  *
150b725ae77Skettenis  *   Params:
151b725ae77Skettenis  *              Input: devid         Device to use, or CH_DEFAULT_DEV
152b725ae77Skettenis  *                     chanid        Channel to use for tx
153b725ae77Skettenis  *                     buffer        Pointer to data to send
154b725ae77Skettenis  *                     len           Length of data to send
155b725ae77Skettenis  *             Output: -
156b725ae77Skettenis  *             In/Out: -
157b725ae77Skettenis  *
158b725ae77Skettenis  *            Returns: CE_OKAY       Transmission completed
159b725ae77Skettenis  *                     CE_BAD_CHAN   Channel id invalid
160b725ae77Skettenis  *                     CE_ABANDONED  Tx abandoned due to device switch
161b725ae77Skettenis  *
162b725ae77Skettenis  *      Reads globals: -
163b725ae77Skettenis  *   Modifies globals: -
164b725ae77Skettenis  *
165b725ae77Skettenis  * Other side effects: -
166b725ae77Skettenis  */
167b725ae77Skettenis 
168b725ae77Skettenis ChanError angel_ChannelSend(DeviceID devid, ChannelID chanid,
169b725ae77Skettenis                             const p_Buffer buffer, unsigned len);
170b725ae77Skettenis 
171b725ae77Skettenis 
172b725ae77Skettenis /*
173b725ae77Skettenis  * Function: angel_ChannelSendAsync
174b725ae77Skettenis  *  Purpose: asynchronous send of a packet via a channel
175b725ae77Skettenis  *
176b725ae77Skettenis  *   Params:
177b725ae77Skettenis  *              Input: devid         Device to use, or CH_DEFAULT_DEV
178b725ae77Skettenis  *                     chanid        Channel to use for tx
179b725ae77Skettenis  *                     buffer        Pointer to data to send
180b725ae77Skettenis  *                     len           Length of data to send
181b725ae77Skettenis  *                     callback      Function to call on completion
182b725ae77Skettenis  *                     callback_data Pointer to pass to callback
183b725ae77Skettenis  *             Output: -
184b725ae77Skettenis  *             In/Out: -
185b725ae77Skettenis  *
186b725ae77Skettenis  *            Returns: CE_OKAY       Transmission underway
187b725ae77Skettenis  *                     CE_BAD_CHAN   Channel id invalid
188b725ae77Skettenis  *                     CE_ABANDONED  Tx abandoned due to device switch
189b725ae77Skettenis  *
190b725ae77Skettenis  *      Reads globals: -
191b725ae77Skettenis  *   Modifies globals: -
192b725ae77Skettenis  *
193b725ae77Skettenis  * Other side effects: -
194b725ae77Skettenis  *
195b725ae77Skettenis  * register an asynchronous send on the given channel
196b725ae77Skettenis  * (blocks until send can be commenced)
197b725ae77Skettenis  */
198b725ae77Skettenis 
199b725ae77Skettenis typedef void (*ChanTx_CB_Fn)(ChannelID  chanid,         /* which channel  */
200b725ae77Skettenis                              void      *callback_data); /* as supplied... */
201b725ae77Skettenis 
202b725ae77Skettenis 
203b725ae77Skettenis ChanError angel_ChannelSendAsync(          DeviceID      devid,
204b725ae77Skettenis                                            ChannelID     chanid,
205b725ae77Skettenis                                      const p_Buffer      buffer,
206b725ae77Skettenis                                            unsigned      len,
207b725ae77Skettenis                                            ChanTx_CB_Fn  callback,
208b725ae77Skettenis                                            void         *callback_data);
209b725ae77Skettenis 
210b725ae77Skettenis 
211b725ae77Skettenis /*
212b725ae77Skettenis  * Function: angel_ChannelRead
213b725ae77Skettenis  *  Purpose: blocking read of a packet from a channel
214b725ae77Skettenis  *
215b725ae77Skettenis  *   Params:
216b725ae77Skettenis  *              Input: devid         Device to use, or CH_DEFAULT_DEV
217b725ae77Skettenis  *                     chanid        Channel to use for rx
218b725ae77Skettenis  *             Output: buffer        The buffer, supplied and filled
219b725ae77Skettenis  *                     len           How many bytes there are in the buffer
220b725ae77Skettenis  *             In/Out: -
221b725ae77Skettenis  *
222b725ae77Skettenis  *            Returns: CE_OKAY       Reception successful
223b725ae77Skettenis  *                     CE_BAD_CHAN   Channel id invalid
224b725ae77Skettenis  *                     CE_ABANDONED  Tx abandoned due to device switch
225b725ae77Skettenis  *
226b725ae77Skettenis  *      Reads globals: -
227b725ae77Skettenis  *   Modifies globals: -
228b725ae77Skettenis  *
229b725ae77Skettenis  * Other side effects: -
230b725ae77Skettenis  *
231b725ae77Skettenis  * Note that in the present version, if an asynchronous read has been
232b725ae77Skettenis  * registered, a blocking read will be refused with CE_BUSY.
233b725ae77Skettenis  */
234b725ae77Skettenis ChanError angel_ChannelRead(DeviceID      devid,
235b725ae77Skettenis                             ChannelID     chanid,
236b725ae77Skettenis                             p_Buffer     *buffer,
237b725ae77Skettenis                             unsigned     *len);
238b725ae77Skettenis 
239b725ae77Skettenis 
240b725ae77Skettenis /*
241b725ae77Skettenis  * Function: angel_ChannelReadAsync
242b725ae77Skettenis  *  Purpose: asynchronous read of a packet via a channel
243b725ae77Skettenis  *
244b725ae77Skettenis  *   Params:
245b725ae77Skettenis  *              Input: devid         Device to use, or CH_DEFAULT_DEV
246b725ae77Skettenis  *                     chanid        Channel to wait on
247b725ae77Skettenis  *                     callback      Function to call on completion, or NULL
248b725ae77Skettenis  *                     callback_data Pointer to pass to callback
249b725ae77Skettenis  *             Output: -
250b725ae77Skettenis  *             In/Out: -
251b725ae77Skettenis  *
252b725ae77Skettenis  *            Returns: CE_OKAY       Read request registered
253b725ae77Skettenis  *                     CE_BAD_CHAN   Channel id invalid
254b725ae77Skettenis  *                     CE_BUSY       Someone else is using the channel
255b725ae77Skettenis  *                                   (in a single threaded world)
256b725ae77Skettenis  *
257b725ae77Skettenis  *      Reads globals: -
258b725ae77Skettenis  *   Modifies globals: -
259b725ae77Skettenis  *
260b725ae77Skettenis  * Other side effects: -
261b725ae77Skettenis  *
262b725ae77Skettenis  * Register an asynchronous read on the given channel.  There can only be one
263b725ae77Skettenis  * async. reader per channel, and blocking reads are not permitted whilst
264b725ae77Skettenis  * an async. reader is registered.
265b725ae77Skettenis  *
266b725ae77Skettenis  * Reader can unregister by specifying NULL as the callback function.
267b725ae77Skettenis  */
268b725ae77Skettenis 
269b725ae77Skettenis typedef void (*ChanRx_CB_Fn)(DeviceID   devID,   /* ID of receiving device  */
270b725ae77Skettenis                              ChannelID  chanID,  /* ID of receiving channel */
271b725ae77Skettenis                              p_Buffer   buff,    /* pointer to buffer       */
272b725ae77Skettenis                              unsigned   len,     /* length of data          */
273b725ae77Skettenis                              void      *cb_data  /* callback data           */
274b725ae77Skettenis                              );
275b725ae77Skettenis 
276b725ae77Skettenis ChanError angel_ChannelReadAsync(DeviceID      devid,
277b725ae77Skettenis                                  ChannelID     chanid,
278b725ae77Skettenis                                  ChanRx_CB_Fn  callback,
279b725ae77Skettenis                                  void         *callback_data);
280b725ae77Skettenis 
281b725ae77Skettenis 
282b725ae77Skettenis /*
283b725ae77Skettenis  * Function: angel_ChannelReadAll
284b725ae77Skettenis  *  Purpose: register an asynchronous read across all devices
285b725ae77Skettenis  *
286b725ae77Skettenis  *   Params:
287b725ae77Skettenis  *              Input: chanid        Channel to look for (usually HBOOT)
288b725ae77Skettenis  *                     callback      Function to call on completion
289b725ae77Skettenis  *                     callback_data Pointer to pass to callback
290b725ae77Skettenis  *             Output: -
291b725ae77Skettenis  *             In/Out: -
292b725ae77Skettenis  *
293b725ae77Skettenis  *            Returns: CE_OKAY       Read request registered
294b725ae77Skettenis  *                     CE_BAD_CHAN   Channel id invalid
295b725ae77Skettenis  *                     CE_BUSY       Someone else is reading all devices
296b725ae77Skettenis  *
297b725ae77Skettenis  *      Reads globals: -
298b725ae77Skettenis  *   Modifies globals: -
299b725ae77Skettenis  *
300b725ae77Skettenis  * Other side effects: -
301b725ae77Skettenis  *
302b725ae77Skettenis  * Register an asynchronous read across all devices.  This is a 'fallback',
303b725ae77Skettenis  * which will be superseded (temporarily) by a registered reader or blocking
304b725ae77Skettenis  * read on a specific device.
305b725ae77Skettenis  */
306b725ae77Skettenis 
307b725ae77Skettenis ChanError angel_ChannelReadAll(         ChannelID     chanid,
308b725ae77Skettenis                                         ChanRx_CB_Fn  callback,
309b725ae77Skettenis                                         void         *callback_data);
310b725ae77Skettenis 
311b725ae77Skettenis 
312b725ae77Skettenis 
313b725ae77Skettenis /*
314b725ae77Skettenis  * Function: angel_ChannelSendThenRead
315b725ae77Skettenis  *  Purpose: blocking write to followed by read from a channel
316b725ae77Skettenis  *
317b725ae77Skettenis  *   Params:
318b725ae77Skettenis  *              Input: devid         Device to use, or CH_DEFAULT_DEV
319b725ae77Skettenis  *                     chanid        Channel to use for rx
320b725ae77Skettenis  *             In/Out: buffer        On entry:  the packet to be sent
321b725ae77Skettenis  *                                   On return: the packet received
322b725ae77Skettenis  *                     len           On entry:  length of packet to be sent
323b725ae77Skettenis  *                                   On return: length of packet rx'd
324b725ae77Skettenis  *             In/Out: -
325b725ae77Skettenis  *
326b725ae77Skettenis  *            Returns: CE_OKAY       Tx and Reception successful
327b725ae77Skettenis  *                     CE_BAD_CHAN   Channel id invalid
328b725ae77Skettenis  *                     CE_ABANDONED  Tx abandoned due to device switch
329b725ae77Skettenis  *
330b725ae77Skettenis  *      Reads globals: -
331b725ae77Skettenis  *   Modifies globals: -
332b725ae77Skettenis  *
333b725ae77Skettenis  * Other side effects: -
334b725ae77Skettenis  *
335b725ae77Skettenis  * Note that in the present version, if an asynchronous read has been
336b725ae77Skettenis  * registered, this will be refused with CE_BUSY.
337b725ae77Skettenis  */
338b725ae77Skettenis ChanError angel_ChannelSendThenRead(DeviceID      devid,
339b725ae77Skettenis                                     ChannelID     chanid,
340b725ae77Skettenis                                     p_Buffer     *buffer,
341b725ae77Skettenis                                     unsigned     *len);
342b725ae77Skettenis 
343b725ae77Skettenis 
344b725ae77Skettenis /*
345b725ae77Skettenis  * Function: angel_ChannelSelectDevice
346b725ae77Skettenis  *  Purpose: select the device to be used for all channel comms
347b725ae77Skettenis  *
348b725ae77Skettenis  *   Params:
349b725ae77Skettenis  *              Input: device        ID of device to use as the default
350b725ae77Skettenis  *             Output: -
351b725ae77Skettenis  *             In/Out: -
352b725ae77Skettenis  *
353b725ae77Skettenis  *            Returns: CE_OKAY       Default device selected
354b725ae77Skettenis  *                     CE_BAD_DEV    Invalid device ID
355b725ae77Skettenis  *
356b725ae77Skettenis  *      Reads globals: -
357b725ae77Skettenis  *   Modifies globals: -
358b725ae77Skettenis  *
359b725ae77Skettenis  * Other side effects: Any channel operations in progress are
360b725ae77Skettenis  *                     abandoned.
361b725ae77Skettenis  *
362b725ae77Skettenis  * select the device for all channels comms
363b725ae77Skettenis  */
364b725ae77Skettenis 
365b725ae77Skettenis ChanError angel_ChannelSelectDevice(DeviceID device);
366b725ae77Skettenis 
367b725ae77Skettenis 
368b725ae77Skettenis /*
369b725ae77Skettenis  * Function: angel_ChannelReadActiveDevice
370b725ae77Skettenis  *  Purpose: reads the device id of the currently active device
371b725ae77Skettenis  *
372b725ae77Skettenis  *   Params:
373b725ae77Skettenis  *              Input: device        address of a DeviceID variable
374b725ae77Skettenis  *             Output: *device       ID of device currently being used
375b725ae77Skettenis  *             In/Out: -
376b725ae77Skettenis  *
377b725ae77Skettenis  *            Returns: CE_OKAY       Default device selected
378b725ae77Skettenis  */
379b725ae77Skettenis 
380b725ae77Skettenis ChanError angel_ChannelReadActiveDevice(DeviceID *device);
381b725ae77Skettenis 
382b725ae77Skettenis #endif /* ndef angel_channels_h */
383b725ae77Skettenis 
384b725ae77Skettenis /* EOF channels.h */
385