1 /**
2  * Copyright (c) 2010-2012 Broadcom. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions, and the following disclaimer,
9  *    without modification.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  * 3. The names of the above-listed copyright holders may not be used
14  *    to endorse or promote products derived from this software without
15  *    specific prior written permission.
16  *
17  * ALTERNATIVELY, this software may be distributed under the terms of the
18  * GNU General Public License ("GPL") version 2, as published by the Free
19  * Software Foundation.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
22  * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
23  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
24  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
25  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
26  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
27  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
28  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
29  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
30  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
31  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32  */
33 
34 #ifndef CONNECTION_H_
35 #define CONNECTION_H_
36 
37 #include "interface/vchi/vchi_cfg_internal.h"
38 #include "interface/vchi/vchi_common.h"
39 #include "interface/vchi/message_drivers/message.h"
40 
41 /******************************************************************************
42  Global defs
43  *****************************************************************************/
44 
45 // Opaque handle for a connection / service pair
46 typedef struct opaque_vchi_connection_connected_service_handle_t *VCHI_CONNECTION_SERVICE_HANDLE_T;
47 
48 // opaque handle to the connection state information
49 typedef struct opaque_vchi_connection_info_t VCHI_CONNECTION_STATE_T;
50 
51 typedef struct vchi_connection_t VCHI_CONNECTION_T;
52 
53 
54 /******************************************************************************
55  API
56  *****************************************************************************/
57 
58 // Routine to init a connection with a particular low level driver
59 typedef VCHI_CONNECTION_STATE_T * (*VCHI_CONNECTION_INIT_T)( struct vchi_connection_t * connection,
60                                                              const VCHI_MESSAGE_DRIVER_T * driver );
61 
62 // Routine to control CRC enabling at a connection level
63 typedef int32_t (*VCHI_CONNECTION_CRC_CONTROL_T)( VCHI_CONNECTION_STATE_T *state_handle,
64                                                   VCHI_CRC_CONTROL_T control );
65 
66 // Routine to create a service
67 typedef int32_t (*VCHI_CONNECTION_SERVICE_CONNECT_T)( VCHI_CONNECTION_STATE_T *state_handle,
68                                                       int32_t service_id,
69                                                       uint32_t rx_fifo_size,
70                                                       uint32_t tx_fifo_size,
71                                                       int server,
72                                                       VCHI_CALLBACK_T callback,
73                                                       void *callback_param,
74                                                       int32_t want_crc,
75                                                       int32_t want_unaligned_bulk_rx,
76                                                       int32_t want_unaligned_bulk_tx,
77                                                       VCHI_CONNECTION_SERVICE_HANDLE_T *service_handle );
78 
79 // Routine to close a service
80 typedef int32_t (*VCHI_CONNECTION_SERVICE_DISCONNECT_T)( VCHI_CONNECTION_SERVICE_HANDLE_T service_handle );
81 
82 // Routine to queue a message
83 typedef int32_t (*VCHI_CONNECTION_SERVICE_QUEUE_MESSAGE_T)( VCHI_CONNECTION_SERVICE_HANDLE_T service_handle,
84                                                             const void *data,
85                                                             uint32_t data_size,
86                                                             VCHI_FLAGS_T flags,
87                                                             void *msg_handle );
88 
89 // scatter-gather (vector) message queueing
90 typedef int32_t (*VCHI_CONNECTION_SERVICE_QUEUE_MESSAGEV_T)( VCHI_CONNECTION_SERVICE_HANDLE_T service_handle,
91                                                              VCHI_MSG_VECTOR_T *vector,
92                                                              uint32_t count,
93                                                              VCHI_FLAGS_T flags,
94                                                              void *msg_handle );
95 
96 // Routine to dequeue a message
97 typedef int32_t (*VCHI_CONNECTION_SERVICE_DEQUEUE_MESSAGE_T)( VCHI_CONNECTION_SERVICE_HANDLE_T service_handle,
98                                                               void *data,
99                                                               uint32_t max_data_size_to_read,
100                                                               uint32_t *actual_msg_size,
101                                                               VCHI_FLAGS_T flags );
102 
103 // Routine to peek at a message
104 typedef int32_t (*VCHI_CONNECTION_SERVICE_PEEK_MESSAGE_T)( VCHI_CONNECTION_SERVICE_HANDLE_T service_handle,
105                                                            void **data,
106                                                            uint32_t *msg_size,
107                                                            VCHI_FLAGS_T flags );
108 
109 // Routine to hold a message
110 typedef int32_t (*VCHI_CONNECTION_SERVICE_HOLD_MESSAGE_T)( VCHI_CONNECTION_SERVICE_HANDLE_T service_handle,
111                                                            void **data,
112                                                            uint32_t *msg_size,
113                                                            VCHI_FLAGS_T flags,
114                                                            void **message_handle );
115 
116 // Routine to initialise a received message iterator
117 typedef int32_t (*VCHI_CONNECTION_SERVICE_LOOKAHEAD_MESSAGE_T)( VCHI_CONNECTION_SERVICE_HANDLE_T service_handle,
118                                                                 VCHI_MSG_ITER_T *iter,
119                                                                 VCHI_FLAGS_T flags );
120 
121 // Routine to release a held message
122 typedef int32_t (*VCHI_CONNECTION_HELD_MSG_RELEASE_T)( VCHI_CONNECTION_SERVICE_HANDLE_T service_handle,
123                                                        void *message_handle );
124 
125 // Routine to get info on a held message
126 typedef int32_t (*VCHI_CONNECTION_HELD_MSG_INFO_T)( VCHI_CONNECTION_SERVICE_HANDLE_T service_handle,
127                                                     void *message_handle,
128                                                     void **data,
129                                                     int32_t *msg_size,
130                                                     uint32_t *tx_timestamp,
131                                                     uint32_t *rx_timestamp );
132 
133 // Routine to check whether the iterator has a next message
134 typedef int32_t (*VCHI_CONNECTION_MSG_ITER_HAS_NEXT_T)( VCHI_CONNECTION_SERVICE_HANDLE_T service,
135                                                        const VCHI_MSG_ITER_T *iter );
136 
137 // Routine to advance the iterator
138 typedef int32_t (*VCHI_CONNECTION_MSG_ITER_NEXT_T)( VCHI_CONNECTION_SERVICE_HANDLE_T service,
139                                                     VCHI_MSG_ITER_T *iter,
140                                                     void **data,
141                                                     uint32_t *msg_size );
142 
143 // Routine to remove the last message returned by the iterator
144 typedef int32_t (*VCHI_CONNECTION_MSG_ITER_REMOVE_T)( VCHI_CONNECTION_SERVICE_HANDLE_T service,
145                                                       VCHI_MSG_ITER_T *iter );
146 
147 // Routine to hold the last message returned by the iterator
148 typedef int32_t (*VCHI_CONNECTION_MSG_ITER_HOLD_T)( VCHI_CONNECTION_SERVICE_HANDLE_T service,
149                                                     VCHI_MSG_ITER_T *iter,
150                                                     void **msg_handle );
151 
152 // Routine to transmit bulk data
153 typedef int32_t (*VCHI_CONNECTION_BULK_QUEUE_TRANSMIT_T)( VCHI_CONNECTION_SERVICE_HANDLE_T service_handle,
154                                                           const void *data_src,
155                                                           uint32_t data_size,
156                                                           VCHI_FLAGS_T flags,
157                                                           void *bulk_handle );
158 
159 // Routine to receive data
160 typedef int32_t (*VCHI_CONNECTION_BULK_QUEUE_RECEIVE_T)( VCHI_CONNECTION_SERVICE_HANDLE_T service_handle,
161                                                          void *data_dst,
162                                                          uint32_t data_size,
163                                                          VCHI_FLAGS_T flags,
164                                                          void *bulk_handle );
165 
166 // Routine to report if a server is available
167 typedef int32_t (*VCHI_CONNECTION_SERVER_PRESENT)( VCHI_CONNECTION_STATE_T *state, int32_t service_id, int32_t peer_flags );
168 
169 // Routine to report the number of RX slots available
170 typedef int (*VCHI_CONNECTION_RX_SLOTS_AVAILABLE)( const VCHI_CONNECTION_STATE_T *state );
171 
172 // Routine to report the RX slot size
173 typedef uint32_t (*VCHI_CONNECTION_RX_SLOT_SIZE)( const VCHI_CONNECTION_STATE_T *state );
174 
175 // Callback to indicate that the other side has added a buffer to the rx bulk DMA FIFO
176 typedef void (*VCHI_CONNECTION_RX_BULK_BUFFER_ADDED)(VCHI_CONNECTION_STATE_T *state,
177                                                      int32_t service,
178                                                      uint32_t length,
179                                                      MESSAGE_TX_CHANNEL_T channel,
180                                                      uint32_t channel_params,
181                                                      uint32_t data_length,
182                                                      uint32_t data_offset);
183 
184 // Callback to inform a service that a Xon or Xoff message has been received
185 typedef void (*VCHI_CONNECTION_FLOW_CONTROL)(VCHI_CONNECTION_STATE_T *state, int32_t service_id, int32_t xoff);
186 
187 // Callback to inform a service that a server available reply message has been received
188 typedef void (*VCHI_CONNECTION_SERVER_AVAILABLE_REPLY)(VCHI_CONNECTION_STATE_T *state, int32_t service_id, uint32_t flags);
189 
190 // Callback to indicate that bulk auxiliary messages have arrived
191 typedef void (*VCHI_CONNECTION_BULK_AUX_RECEIVED)(VCHI_CONNECTION_STATE_T *state);
192 
193 // Callback to indicate that bulk auxiliary messages have arrived
194 typedef void (*VCHI_CONNECTION_BULK_AUX_TRANSMITTED)(VCHI_CONNECTION_STATE_T *state, void *handle);
195 
196 // Callback with all the connection info you require
197 typedef void (*VCHI_CONNECTION_INFO)(VCHI_CONNECTION_STATE_T *state, uint32_t protocol_version, uint32_t slot_size, uint32_t num_slots, uint32_t min_bulk_size);
198 
199 // Callback to inform of a disconnect
200 typedef void (*VCHI_CONNECTION_DISCONNECT)(VCHI_CONNECTION_STATE_T *state, uint32_t flags);
201 
202 // Callback to inform of a power control request
203 typedef void (*VCHI_CONNECTION_POWER_CONTROL)(VCHI_CONNECTION_STATE_T *state, MESSAGE_TX_CHANNEL_T channel, int32_t enable);
204 
205 // allocate memory suitably aligned for this connection
206 typedef void * (*VCHI_BUFFER_ALLOCATE)(VCHI_CONNECTION_SERVICE_HANDLE_T service_handle, uint32_t * length);
207 
208 // free memory allocated by buffer_allocate
209 typedef void   (*VCHI_BUFFER_FREE)(VCHI_CONNECTION_SERVICE_HANDLE_T service_handle, void * address);
210 
211 
212 /******************************************************************************
213  System driver struct
214  *****************************************************************************/
215 
216 struct opaque_vchi_connection_api_t
217 {
218    // Routine to init the connection
219    VCHI_CONNECTION_INIT_T                      init;
220 
221    // Connection-level CRC control
222    VCHI_CONNECTION_CRC_CONTROL_T               crc_control;
223 
224    // Routine to connect to or create service
225    VCHI_CONNECTION_SERVICE_CONNECT_T           service_connect;
226 
227    // Routine to disconnect from a service
228    VCHI_CONNECTION_SERVICE_DISCONNECT_T        service_disconnect;
229 
230    // Routine to queue a message
231    VCHI_CONNECTION_SERVICE_QUEUE_MESSAGE_T     service_queue_msg;
232 
233    // scatter-gather (vector) message queue
234    VCHI_CONNECTION_SERVICE_QUEUE_MESSAGEV_T    service_queue_msgv;
235 
236    // Routine to dequeue a message
237    VCHI_CONNECTION_SERVICE_DEQUEUE_MESSAGE_T   service_dequeue_msg;
238 
239    // Routine to peek at a message
240    VCHI_CONNECTION_SERVICE_PEEK_MESSAGE_T      service_peek_msg;
241 
242    // Routine to hold a message
243    VCHI_CONNECTION_SERVICE_HOLD_MESSAGE_T      service_hold_msg;
244 
245    // Routine to initialise a received message iterator
246    VCHI_CONNECTION_SERVICE_LOOKAHEAD_MESSAGE_T service_look_ahead_msg;
247 
248    // Routine to release a message
249    VCHI_CONNECTION_HELD_MSG_RELEASE_T          held_msg_release;
250 
251    // Routine to get information on a held message
252    VCHI_CONNECTION_HELD_MSG_INFO_T             held_msg_info;
253 
254    // Routine to check for next message on iterator
255    VCHI_CONNECTION_MSG_ITER_HAS_NEXT_T         msg_iter_has_next;
256 
257    // Routine to get next message on iterator
258    VCHI_CONNECTION_MSG_ITER_NEXT_T             msg_iter_next;
259 
260    // Routine to remove the last message returned by iterator
261    VCHI_CONNECTION_MSG_ITER_REMOVE_T           msg_iter_remove;
262 
263    // Routine to hold the last message returned by iterator
264    VCHI_CONNECTION_MSG_ITER_HOLD_T             msg_iter_hold;
265 
266    // Routine to transmit bulk data
267    VCHI_CONNECTION_BULK_QUEUE_TRANSMIT_T       bulk_queue_transmit;
268 
269    // Routine to receive data
270    VCHI_CONNECTION_BULK_QUEUE_RECEIVE_T        bulk_queue_receive;
271 
272    // Routine to report the available servers
273    VCHI_CONNECTION_SERVER_PRESENT              server_present;
274 
275    // Routine to report the number of RX slots available
276    VCHI_CONNECTION_RX_SLOTS_AVAILABLE          connection_rx_slots_available;
277 
278    // Routine to report the RX slot size
279    VCHI_CONNECTION_RX_SLOT_SIZE                connection_rx_slot_size;
280 
281    // Callback to indicate that the other side has added a buffer to the rx bulk DMA FIFO
282    VCHI_CONNECTION_RX_BULK_BUFFER_ADDED        rx_bulk_buffer_added;
283 
284    // Callback to inform a service that a Xon or Xoff message has been received
285    VCHI_CONNECTION_FLOW_CONTROL                flow_control;
286 
287    // Callback to inform a service that a server available reply message has been received
288    VCHI_CONNECTION_SERVER_AVAILABLE_REPLY      server_available_reply;
289 
290    // Callback to indicate that bulk auxiliary messages have arrived
291    VCHI_CONNECTION_BULK_AUX_RECEIVED           bulk_aux_received;
292 
293    // Callback to indicate that a bulk auxiliary message has been transmitted
294    VCHI_CONNECTION_BULK_AUX_TRANSMITTED        bulk_aux_transmitted;
295 
296    // Callback to provide information about the connection
297    VCHI_CONNECTION_INFO                        connection_info;
298 
299    // Callback to notify that peer has requested disconnect
300    VCHI_CONNECTION_DISCONNECT                  disconnect;
301 
302    // Callback to notify that peer has requested power change
303    VCHI_CONNECTION_POWER_CONTROL               power_control;
304 
305    // allocate memory suitably aligned for this connection
306    VCHI_BUFFER_ALLOCATE                        buffer_allocate;
307 
308    // free memory allocated by buffer_allocate
309    VCHI_BUFFER_FREE                            buffer_free;
310 
311 };
312 
313 struct vchi_connection_t {
314    const VCHI_CONNECTION_API_T *api;
315    VCHI_CONNECTION_STATE_T     *state;
316 #ifdef VCHI_COARSE_LOCKING
317    struct semaphore             sem;
318 #endif
319 };
320 
321 
322 #endif /* CONNECTION_H_ */
323 
324 /****************************** End of file **********************************/
325